如何在Django多对多关系中筛选结果?我的查询写法是否正确?
问题分析与解决方案
你的写法存在一个小问题,无法正确获取到当前用户被提及的所有帖子,我来给你详细拆解说明:
现有代码的问题点
你当前的查询语句:
posts = Post.objects.filter(mentions__in=customer).order_by('-created_at')
这里的mentions__in查询参数要求传入一个可迭代对象(比如列表、QuerySet),但你传入的是单个Customer实例,这会导致查询报错或者返回不符合预期的结果。
正确的写法
写法一:直接匹配单个对象
既然你要找的是提及当前customer的帖子,直接用等于匹配即可,不需要__in:
customer = Customer.objects.get(user=request.user) posts = Post.objects.filter(mentions=customer).order_by('-created_at')
写法二:利用反向关联更简洁
由于你在Post.mentions字段中设置了related_name='mentions',这意味着Customer实例可以通过反向关联直接获取所有提及它的帖子,代码会更直观:
customer = Customer.objects.get(user=request.user) posts = customer.mentions.all().order_by('-created_at')
额外提醒:模型定义的语法问题
你的Post模型定义有语法错误,ForeignKey字段必须指定on_delete参数,修正后的完整模型应该是:
class Customer(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) class Post(models.Model): customer = models.ForeignKey('common.Customer', on_delete=models.CASCADE) # 补充on_delete参数 mentions = models.ManyToManyField('common.Customer', related_name='mentions')
内容的提问来源于stack exchange,提问作者Atma
相关产品推荐
相关产品推荐

