Python Django通过关系查询的非对称自我
我有以下简化模型:Python Django通过关系查询的非对称自我,python,django,django-orm,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.ForeignK
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()
获取用户正在跟踪的所有用户(挂起的关系或真正的跟踪)
或
要获得以下所有具有用户和真正友谊的对象
但是如何获取User和status=1的所有用户对象呢?
我似乎找不到办法
谢谢大家! 试试看
user.following.filter(to_user__status=1)
user.following
仍在查询user
,因此您需要在此处将关系w/\uuuu
扩展到following
这里的两个字段,from_user
和to_user
,都是指向用户
模型的外键。因此,对于用户()
实例u
:
u.following
通过中间表搜索与w/u
有关系的User()
s。这里的关键是u.following
在following
中选择指向用户的第一个ForeignKey
,作为对u
本身的引用。因此,对于您版本的Follow
,u.following.filter(to_user\u status=1)
在following
项目上进行过滤,该项目的from_user
等于u
和to_user
状态等于1
。查找是典型的
u.from\u user
在中间表中搜索那些from\u user
等于u
u.to_user
在中间表中搜索那些to_user
等于u
此外,您还可以直接在外键上进行筛选,记住从用户和到用户都是参考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
看来
user.following.filter(to_user__status=1)
这就是诀窍。有人能给我解释一下为什么,以及它是如何工作的吗?
user。下面是一个正在查询用户的ManyRelatedManager。user.following.filter(from\u user\u status=1)
会做什么?猜不出它会返回什么。。。
再次感谢 from_user ForeignKey是到UserProfile还是到user?实际上这是我的模型的一个非常简化的版本,我忘了将UserProfile更改为user,谢谢,编辑您是否可能将AUTH_PROFILE_模块添加到用户模型?我正在使用该模块,但我只是复制和粘贴,我首先尝试使用这个简化版本,但出现以下错误:FieldError:无法将关键字“status”解析为字段。选项如下:id
@noe请发布整个错误消息,通常它会列出可用的选项。看起来您的用户经理在那里。很抱歉,我复制了错误的行,这是正确的:FieldError:无法将关键字“status”解析到字段中。选择如下:following,from_user,id,to_user,user
当我使用user.following.filter(status=1)…这似乎起作用了,但是你能解释一下到_user\u status
部分吗?我不明白这是怎么回事<代码>用户。下面是一个ManyRelatedManager,正如您所说,它正在查询用户。所以user.following
就是找到用户正在跟踪的用户对象,那么to\u user
是如何派上用场的呢?user.following.filter(from\u user\u status=1)
会做什么?在我看来,这个查询的结果不太符合逻辑。再次感谢,一旦我理解,我将验证:)
user.following.filter(to_user__status=1)