如何在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
相关产品推荐
相关产品推荐

