Django多对多字段related_name疑问:两次查询结果为何不同?
为啥这两个Django查询结果不一样?
嘿,这事儿核心就是Django里related_name这个参数在起作用,我给你拆解明白:
首先先看你的Profile模型里的两个关键字段:
user = models.OneToOneField(User):这建立了User和Profile的一对一关联,所以每个User实例都能通过user.profile拿到对应的Profile对象。followers = models.ManyToManyField(User, related_name='is_following', blank=True):这个字段是用来记录哪些用户关注了当前Profile对应的用户。而related_name='is_following'是给这个多对多关系定义了一个反向关联的名称。
现在来逐个解释你执行的两个查询:
1. User.profile.followers.all()
这里的User应该是指某个具体的用户实例(比如my_user = User.objects.get(username='张三')),执行my_user.profile.followers.all()时,你是在获取关注张三的所有用户列表——因为followers字段存在张三的Profile里,专门存的是他的粉丝。
2. User.is_following.all()
同样针对某个具体用户实例(比如还是张三),执行my_user.is_following.all()时,你是在获取张三正在关注的所有Profile对象。因为related_name='is_following'定义了从User反向关联回Profile的入口:当张三关注了李四,李四的Profile的followers里会加入张三,同时张三的is_following就会关联到李四的Profile。如果想直接拿到张三关注的用户,你可以这么写:
[p.user for p in my_user.is_following.all()]
简单总结一下:
user.profile.followers.all()→ 谁关注了这个useruser.is_following.all()→ 这个user关注了谁(返回的是Profile对象,取.user就能拿到对应的用户)
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

