7

我试图从同步器创建的数据中从每个相册中获取随机照片。模型(缩写)如下所示:


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 画廊(请求,模板名称='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

4 回答 4

24

order_by您可以使用带有问号作为参数的方法从任何查询集中获取单个随机对象。这可能比调用 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()]
于 2009-07-16T18:00:01.980 回答
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
于 2009-07-16T17:39:54.373 回答
4
randomPhotos = [random.choice(album.photos.objects.all()) for album in album.objects.all()]
于 2009-07-16T17:37:00.230 回答
3

如果您在 Album 模型中创建自定义方法,则看起来像这样:

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

这将从当前相册实例返回一张随机照片,即

albumObj.random_photo()

注意:未经测试的代码

于 2009-07-16T17:42:40.687 回答