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

Django-从每个相册中随机选择一张照片,django,django-queryset,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) def random_photo

我试图从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)
def random_photo(self):
    import random
    return random.choice(self.photos.all())
我尝试过很多不同的方法,但都没有成功。这是另一个简单的吗

第二步:最终代码:

def图库(请求,模板_name='galleries.html'):


我还没有测试代码,但这是正确的想法,与select_相关的应该可以帮助您避免产生太多的db查询

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

如果在相册模型中创建自定义方法,则如下所示:


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

class Photo(models.Model):
    title = models.CharField(max_length=200)
def random_photo(self):
    import random
    return random.choice(self.photos.all())
这将从当前相册实例返回一张随机照片,即

albumObj.random_photo()

注意:未测试的代码

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

例如,此查询将返回一张随机照片:

Photo.objects.order_by(“?”)[:1]

以下不是最佳的,因为每个相册需要一个查询,但它可以工作:

photos = []
for a in Album.objects.all():
    photo = a.photos.order_by('?')[:1]
    photos.append(photo)
编辑:
[0]
索引更改为
[:1]
,因为如果相册不包含照片,前者将引发索引器

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

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

哦,很好!对于album.objects.all()中的album,尝试了以下操作:>>>导入random>>>randomPhotos=[random.choice(album.photos.objects.all())对于album.objects.all()中的album,并获得以下结果:回溯(最近一次调用):文件“”,第1行,在?属性错误:“MyReleDealMealMead”对象没有属性“对象”>从相册中删除Word对象。照片.Objt。A.()需要在中间做一些稍微不同的事情,因为假设照片都有0到总数的主键。我可以从所有相册的列表中得到一个随机元素吗?照片+1:看起来这是一个很好的方法,如果可以的话,我可以再给你一个+1,让你教我一些我不知道的关于order_的东西!谢谢请参阅阅读您的博客文章chefsmart。在您的示例中,如果其中一条记录被删除,或者由于其他原因,ID集不是从1开始的连续连续集,会发生什么情况?如果使用数据库缓存(如Johnny cache),order_by(“?”)对于很少编辑的表几乎毫无用处。从所有这些答案中学习了很多,并最终使用了组合。非常感谢all:def galleries(请求,template_name='galleries.html'):albums=Album.objects。为albums:Album\u list中的Album选择相关的().all()Album\u list=[],附加({'title':Album.title,'id':Album.id,'photo':Album.random\u photo())返回render\u to\u响应(模板名称,{'Album\u list':相册_列表,})