Pho*_*beB 7 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)
Run Code Online (Sandbox Code Playgroud)
我尝试了很多不同的方法但没有成功.这是另一个容易吗?
拿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,
})
Run Code Online (Sandbox Code Playgroud)
six*_*ear 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)
Run Code Online (Sandbox Code Playgroud)
编辑:
更改[0]索引,[:1]因为如果列不包含照片,前者将引发IndexError.
或者,在列表理解语法中:
photos = [a.photos.order_by('?')[:1] for a in Album.objects.all()]
Run Code Online (Sandbox Code Playgroud)
我没有测试过代码,但这是正确的想法,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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6182 次 |
| 最近记录: |