2012-11-08 84 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)会做什么?无法猜测它返回的结果... 再次感谢!