Django - 从每张专辑中随机选择一张照片
我试图从每张专辑的同步照片创建一张随机的照片。该模型(缩写)如下所示:Django - 从每张专辑中随机选择一张照片
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画廊(请求,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,
})
我还没有测试的代码,但是这是正确的想法,和select_related应该帮助你从tooooo许多分贝查询...
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
randomPhotos = [random.choice(album.photos.objects.all()) for album in album.objects.all()]
哦,列表理解,好! – 2009-07-16 17:42:48
专辑在Album.objects.all() – 2009-07-16 17:54:27
试过这个: >>> import random >>> randomPhotos = [random.choice(album.photos.objects。所有())相册Album.objects.all()] 并得到这个: 回溯(最近呼吁最后): 文件“
如果你做一个自定义的方法在你的相册样板,这看起来是这样的:
def random_photo(self):
import random
return random.choice(self.photos.all())
,将返回从当前相册实例即
albumObj.random_photo()
注随机的照片:未经测试的代码
你可以得到一个使用带问号作为参数的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]
,因为如果albumn不包含no,则前者将引发IndexError 相片。
或者,在列表中理解语法:
photos = [a.photos.order_by('?')[:1] for a in Album.objects.all()]
学到了很多的所有这些问题的答案,并最终使用的组合。非常感谢所有: DEF画廊(请求,TEMPLATE_NAME = 'galleries.html'): 相册= Album.objects.select_related()中的所有() album_list = [] 用于专辑的专辑: album_list。追加({ '标题':album.title, 'ID':album.id, '照片':album.random_photo()}) 选择render_to_response回报(TEMPLATE_NAME,{ “album_list”:album_list, }) – PhoebeB 2009-07-16 18:38:42