Django - 从每个相册中选择一张随机照片

Pho*_*beB 7 django django-queryset

我试图从syncr创建的数据中获取每张专辑的随机照片.模型(缩写)如下所示:


class Album(models.Model):
    title = models.CharField(max_length=200)
    photos = models.ManyToManyField('Photo')

class Photo(models.Model):
    title = models.CharField(max_length=200)
Run Code Online (Sandbox Code Playgroud)

我尝试了很多不同的方法但没有成功.这是另一个容易吗?

拿2:最终代码:

def gallery(request,template_name ='galleries.html'):

albums = Album.objects.select_related().all()
album_list = []
for album in albums:
   album_list.append({'title':album.title, 'id':album.id, 'photo':album.random_photo()})

return render_to_response(template_name, {
     "album_list": album_list,
})
Run Code Online (Sandbox Code Playgroud)

six*_*ear 24

您可以使用order_by带有问号作为参数的方法从任何Queryset中获取单个随机对象.这可能比调用Photo.objects.all()更好,因为它只会从数据库中返回每个查询的一个照片对象,而不是整个集合,然后使用python过滤列表.

例如,此查询将返回单个随机照片:

Photo.objects.order_by('?')[:1]

以下不是最佳选择,因为每个专辑需要1个查询,但它可以工作:

photos = []
for a in Album.objects.all():
    photo = a.photos.order_by('?')[:1]
    photos.append(photo)
Run Code Online (Sandbox Code Playgroud)

编辑: 更改[0]索引,[:1]因为如果列不包含照片,前者将引发IndexError.

或者,在列表理解语法中:

photos = [a.photos.order_by('?')[:1] for a in Album.objects.all()]
Run Code Online (Sandbox Code Playgroud)

  • +1:看起来这是一个很好的方法,如果我可以给你另外+1给我一些关于order_by的东西,我不知道!谢谢! (2认同)

Gab*_*ley 8

我没有测试过代码,但这是正确的想法,select_related应该可以帮助你产生太多的数据库查询......

from models import Album, Photo
import random

def get_random():
    albums = Album.objects.select_related().all()
    randpics = []
    for album in albums:
        total = album.photos.count()
        photo = album.photos.get(pk=random.randrange(0,total))
        randpics.append(photo)
    return randpics
Run Code Online (Sandbox Code Playgroud)