Django不对称自我通过关系查询

时间:2012-11-08 16:18:56

标签: python django django-orm

我有以下 - 简化 - 模型:

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对象? 我似乎无法找到方法

谢谢!

2 个答案:

答案 0 :(得分:1)

尝试

user.following.filter(to_user__status=1)

user.following仍然在User上查询,因此您需要在此处与__Follow的关系。

此处的两个字段from_userto_userForeignKey指向User模型。因此对于User()实例u

  • u.following通过中间表User()搜索与u有关系的Follow。这里的关键是u.following选择ForeignKey中指向Follow的第一个User,作为对u本身的引用。因此,对于Follow的{​​{1}}版本,u.following.filter(to_user__status=1)过滤了Followfrom_user等于uto_user w / {{1}等于status。查找是典型的following relationship backwards
  • 1在中间表中搜索u.from_user等于from_user的人
  • u在中间表中搜索u.to_user等于to_user的人

此外,您可以直接过滤u,并记住ForeignKeyfrom_user都是to_user

Follow

答案 1 :(得分:0)

似乎

user.following.filter(to_user__status=1)

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