我试图从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,
})
答案 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()
注意:未经测试的代码