2

我有以下 - 简化 - 模型:

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)

以用户用户和真正的友谊获取所有以下对象

但是如何获取 user 和 status=1 的所有 User 对象?我似乎找不到方法

谢谢 !

4

2 回答 2

1

尝试

user.following.filter(to_user__status=1)

user.following仍在查询User,因此您需要跨越与__此处Follow的关系。

这里的两个字段from_userto_userForeignKey指向User模型。因此,User()例如u

  • u.following通过中间表搜索User()与 w/ 有关系的 s 。这里的关键是选择指向 ,的第一个作为对自身的引用。因此,对于您的版本,过滤具有等于和w/等于的项目。查找是典型的反向关系uFollowu.followingForeignKeyFollowUseruFollowu.following.filter(to_user__status=1)Followfrom_useruto_userstatus1
  • u.from_user在中间表中搜索from_user等于u
  • u.to_user在中间表中搜索to_user等于u

此外,您可以直接过滤,并ForeignKey记住from_userandto_user都是 ref 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
于 2012-11-08T16:37:49.323 回答
0

看来

user.following.filter(to_user__status=1)

成功了。有人可以向我解释为什么,以及这是如何工作的吗? user.following是一个正在查询用户的 ManyRelatedManager。会user.following.filter(from_user__status=1)做什么?无法猜测它会返回什么...再次感谢!

于 2012-11-11T18:31:02.647 回答