我有以下 - 简化 - 模型:
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)
获取所有Following对象与User用户和真正的友谊
但是我怎样才能得到 user 和 status=1 的所有 User 对象呢? 我似乎找不到办法
谢谢!
请您参考如下方法:
尝试
user.following.filter(to_user__status=1)
user.following仍在查询 User ,因此您需要跨越关系 w/__至 Follow在这里。
这里的两个字段,from_user和 to_user , 都是 ForeignKey指向 User模型。因此对于 User()实例 u :
-
u.following搜索User()与u有关系的人通过中间表,Follow.这里的关键是u.following选择第一个ForeignKey在Follow指向User, 作为对u的引用本身。因此对于您的版本Follow,u.following.filter(to_user__status=1)Follow上的过滤器项目有from_user等于u和to_user带status等于1.查找是典型的 following relationship backwards -
u.from_user在中间表中搜索具有from_user的那些等于u -
u.to_user在中间表中搜索具有to_user的那些等于u
另外,您可以过滤 ForeignKey直接,记住 from_user和 to_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
