这是我的模型设计:
class Group(models.Model):
name = models.CharField(max_length=30)
...
class User(models.Model):
name = models.CharField(max_length=50)
...
group = models.ForeignKey(Group)
class Photo(models.Model):
title = models.CharField(max_length=100)
...
user = models.ForeignKey(User)
如何获取所有群组的列表,每组下5张属于该群组用户的随机照片?
我试过了:
g = Group.objects.all()
for group in g:
r = Photo.objects.filter(user.group=group).order_by('?')[:5]
这是给予:
Django Version: 1.4.3
Exception Type: SyntaxError
Exception Value:
keyword can't be an expression (views.py, line 37)
Exception Location: /PATH/python2.7/site-packages/django/utils/importlib.py in import_module, line 35
Python Executable: /PATH/python
Python Version: 2.7.3
但即使我的代码有效,我也不相信它是理想的方式,因为它会产生太多的查询。
请帮忙。
答案 0 :(得分:2)
问题是您不能将user.groups
用作.filter(…)
函数的关键字参数。
相反,使用user__groups=group
来跨越用户 - >团体关系:
Photo.objects.filter(user__group=group).order_by('?')[:5]
相关文件:https://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships
不幸的是摆脱for循环会相当棘手,因为它需要querying for the top N rows from a GROUP BY
query ...所以除非你有一堆组,Python for循环可能是最直接的方式这样做。
现在,那说,如果表现很重要,你可能需要提出一个更智能的解决方案,因为ordering by RANDOM()
is very slow也是......