2009-07-16 100 views
7

我试图从每张专辑的同步照片创建一张随机的照片。该模型(缩写)如下所示: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, 
}) 
+0

学到了很多的所有这些问题的答案,并最终使用的组合。非常感谢所有: 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

回答

8

我还没有测试的代码,但是这是正确的想法,和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 
4
randomPhotos = [random.choice(album.photos.objects.all()) for album in album.objects.all()] 
+0

哦,列表理解,好! – 2009-07-16 17:42:48

+0

专辑在Album.objects.all() – 2009-07-16 17:54:27

+0

试过这个: >>> import random >>> randomPhotos = [random.choice(album.photos.objects。所有())相册Album.objects.all()] 并得到这个: 回溯(最近呼吁最后): 文件“”,第1行,在? AttributeError:'ManyRelatedManager'对象没有属性'objects' >>> – PhoebeB 2009-07-16 18:04:03

3

如果你做一个自定义的方法在你的相册样板,这看起来是这样的:

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

,将返回从当前相册实例即

albumObj.random_photo() 

注随机的照片:未经测试的代码

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],因为如果albumn不包含no,则前者将引发IndexError 相片。

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

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