从两级深度选择数据

时间:2012-12-25 19:14:22

标签: python django

这是我的模型设计:

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

但即使我的代码有效,我也不相信它是理想的方式,因为它会产生太多的查询。

请帮忙。

1 个答案:

答案 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也是......