2012-11-08 93 views
2

asymettrical自我,我有以下 - 簡化 - 型號:Django的通過關係查詢

class User(models.Model): 
    following = models.ManyToManyField("self", through='Following', symmetrical=False) 

class Following(models.Model): 
    from_user = models.ForeignKey(User, related_name='from_user') 
    to_user = models.ForeignKey(User, related_name='to_user') 
    status = models.IntegerField() 

狀態是0爲以下 讓用戶成爲一個用戶之前,1。我想獲得的用戶的所有跟隨用戶

我可以做

user.following.all() 

讓所有的用戶的用戶關注中(待定關係或真正遵循)

Following.objects.filter(from_user=user, status=1) 

以獲得用戶用戶和真正的友誼的所有以下對象

但是,如何獲取用戶和狀態= 1的所有用戶對象? 我似乎無法找到方法

謝謝!

+1

是from_user ForeignKey到UserProfile還是User? – RickyA

+0

實際上,這是我的模型的一個非常簡化的版本,我忘了將用戶配置文件更改爲用戶,謝謝編輯 –

+0

您是否曾將AUTH_PROFILE_MODULE打到用戶模型上? – RickyA

回答

1

嘗試

user.following.filter(to_user__status=1) 

user.following還是上查詢User,所以你需要跨越的關係瓦特/ __Follow這裏。

這裏的兩個字段from_userto_user都是ForeignKey指向User的模式。因此,對於User()例如u

  • u.following將搜索User()小號誰通過中間表有關係瓦特/ u,該Follow。這裏的關鍵是,u.following選擇指向UserFollow中的第一個ForeignKey,作爲參考u本身。因此,對於您的版本Followu.following.filter(to_user__status=1)from_user項目上的過濾器等於uto_user w/status等於1。查找是典型following relationship backwards
  • u.from_user搜索中間表的那些from_user等於u
  • u.to_user搜索中間工作臺爲那些有to_user等於u

此外,您可以在ForeignKey直接過濾,請記住from_userto_user均爲Follow

User.objects.filter(to_user__from_user=user, to_user__status=1) # user as from_user 
User.objects.filter(from_user__to_user=user, from_user__status=1) # user as to_user 
User.objects.filter(following=user) # those who are followed by `to_user` user 
+0

我曾試過,但有以下錯誤: FieldError:無法解析關鍵字'狀態'到字段。選擇是:以下,id' –

+0

@noe請發佈整個錯誤消息,通常會列出可用的選項。 – okm

+0

看起來你在那裏有用戶經理。 – RickyA

0

似乎

user.following.filter(to_user__status=1) 

的伎倆。有人可以向我解釋爲什麼,以及這是如何工作的? user.following是在用戶上查詢的ManyRelatedManager。 user.following.filter(from_user__status=1)會做什麼?無法猜測它返回的結果... 再次感謝!