0

这是我的模型设计:

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

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

请帮忙。

4

1 回答 1

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 循环相当棘手,因为它需要从查询中查询前 N 行GROUP BY……所以除非你有一堆组,否则 Python for 循环可能是最直接的方法来做到这一点。

现在,也就是说,如果性能很重要,您可能需要想出一个更智能的解决方案,因为排序RANDOM()也很慢......</p>

于 2012-12-25T19:18:54.760 回答