2012-12-25 26 views
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 

但即使我的代碼工作,我不相信這是理想的方法,因爲它會產生太多的疑問。

請幫忙。

回答

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-loop可能是最直接的方式。

現在,這麼說,如果性能是很重要的,你可能需要拿出因爲ordering by RANDOM() is very slow過一個更聰明的解決方案......

+0

謝謝,實際上固定關於過多查​​詢部分的錯誤,但什麼? –

+0

哦,對不起 - 你說「太多的查詢」是什麼意思?這將會(應該)只執行一個查詢:'SELECT * FROM photo JOIN user ON ...,group ON ... WHERE group.id = group_id ORDER BY RANDOM()LIMIT 5',你可以看到使用以下命令生成的SQL: 'str(Photo.objets.filter(...).order_by(...)[:5])' –

+0

哦,我明白了 - 你想按小組分組。在這種情況下,請參閱更新後的答案。 –