You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:44:04