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

时间:2009-07-16 17:30:47

标签: 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)

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

拿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,
})

4 个答案:

答案 0 :(得分: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)

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

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

photos = [a.photos.order_by('?')[:1] for a in Album.objects.all()]

答案 1 :(得分: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

答案 2 :(得分:4)

randomPhotos = [random.choice(album.photos.objects.all()) for album in album.objects.all()]

答案 3 :(得分:3)

如果您在相册模型中制作自定义方法,则类似于:

def random_photo(self):
    import random
    return random.choice(self.photos.all())

这将返回当前专辑实例中的随机照片,即

albumObj.random_photo()

注意:未经测试的代码