如何在Django中查询当前用户关注者发布的所有文章?
解决Django中查询关注用户文章的问题
嘿,我来帮你搞定这个查询的问题!首先得指出你原来写法的问题:Article.objects.filter(author=user.followers.all()) 是行不通的,因为 user.followers.all() 返回的是一个QuerySet集合,而 filter(author=...) 要求传入单个对象,这时候我们需要用 __in 来匹配多个对象的集合。
不过先别急,我注意到你的Account模型里的ManyToMany字段设置有两个小问题,这可能会让后续的查询逻辑混乱:
- 首先,ManyToMany关联自身时,默认是对称关系(A关注B则B自动关注A),这显然不符合“互相关注/单向关注”的需求,需要加上
symmetrical=False参数。 - 其次,你的
followers和following字段的related_name设置重复了,这会导致反向查询时出现混淆。
先修正你的Account模型(可选但推荐)
调整后的模型更符合逻辑,也更方便后续查询:
class Account(AbstractBaseUser, PermissionsMixin): # followers:所有关注当前用户的人(我的粉丝) followers = models.ManyToManyField( 'Account', related_name='following', # 反向查询:用户关注的人(我关注的人) blank=True, symmetrical=False # 关闭对称,支持单向关注 ) # 其实不需要单独的following字段!通过反向查询request.user.following.all()就能获取我关注的人
正确的查询方法
如果保留你原来的模型(虽然不推荐),查询当前用户关注的人发布的文章应该这样写:
user = self.get_object() # 注意:这里用user.following.all()获取用户关注的列表,然后用__in匹配作者在这个列表里的文章 articles = Article.objects.filter(author__in=user.following.all())
如果用了我推荐的修正后模型,查询可以更简洁高效(减少一次数据库查询):
# 当前用户是request.user的话,直接跨关系查询:找所有作者被当前用户关注的文章 articles = Article.objects.filter(author__followers=request.user)
为什么原来的写法不对?
你原来的author=user.followers.all()试图把一个QuerySet赋值给author字段,而Django的filter方法中,单个字段的匹配需要单个实例,当需要匹配多个实例时,必须使用__in操作符来指定一个集合。
内容的提问来源于stack exchange,提问作者woe-dev.
相关产品推荐
相关产品推荐

