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

如何在Python Django中获取指定帖子评论用户的QuerySet?

解决Django获取指定帖子评论用户QuerySet的问题

嘿,我来帮你搞定这个ORM查询的问题!你要获取id为3的帖子下所有评论用户的对象集合,对吧?先结合你给出的模型结构分析,再给你两种可行的方案,顺带提下更规范的模型设计建议。

基于你当前的模型结构

你的Comment模型用com_id字段存储用户名,那可以通过子查询实现单次数据库查询,高效获取目标用户QuerySet:

from django.contrib.auth.models import User

# 获取id为3的帖子下所有评论用户的QuerySet
comment_users = User.objects.filter(
    username__in=Comment.objects.filter(post__id=3).values('com_id')
)

代码解释:

  • 内层Comment.objects.filter(post__id=3).values('com_id')会先筛选出帖子3的所有评论,仅提取这些评论的com_id字段,返回一个包含用户名的子查询集合。
  • 外层通过username__in匹配这些用户名,直接得到对应的用户对象集合。

如果存在同一个用户多次评论该帖子的情况,可添加.distinct()去重:

comment_users = User.objects.filter(
    username__in=Comment.objects.filter(post__id=3).values('com_id')
).distinct()

更规范的模型设计建议

直接存储用户名不是Django的最佳实践——用户名可能修改,且外键关联能更好利用ORM的关联查询能力。建议把Comment模型的com_id替换为关联User的外键:

from django.contrib.auth.models import User

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='comments')
    # 其他字段...

修改后,查询会更简洁直观:

# 获取帖子3下所有评论用户的QuerySet,自动去重
comment_users = User.objects.filter(comments__post__id=3).distinct()

这里的comments是我们设置的related_name,如果不手动设置,默认会用comment_set,写法变为User.objects.filter(comment_set__post__id=3).distinct()。

为什么你之前的写法出错?

你尝试的User.objects.get(comment__Post.objects.filter(id='3'))不符合Django ORM语法:

  • get()接收的是查询条件(如字段匹配规则),而非嵌套的QuerySet;
  • 跨表关联查询需要用双下划线__串联模型关系,比如comment__post__id这种格式。

内容的提问来源于stack exchange,提问作者HS Park

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:55:34