【问题标题】:How to filter INSIDE foreign key set?如何过滤 INSIDE 外键集?
【发布时间】:2025-12-06 05:35:01
【问题描述】:

有两种型号

class Question(models.Model):
    text = models.TextField()

class Vote(models.Model):
    cas_id = models.IntegerField()
    question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='votes')

我想回答所有问题。每个问题的投票集应仅包含cas_id=123 的投票。某些问题的投票集可能为空。 SQL 查询如下所示:

with user_votes as (
  select *
  from votes
  where cas_id = 123
)
select *
from question q left join user_votes uv on q.id = uv.question_id;

如何在一个查询中通过 django-ORM 完成?

我试过了。

  1. .filter(votes__cas_id=123) 不包括额外的行。
  2. 2 个查询和一些代码工作正常。

【问题讨论】:

  • Question.objects.filter(votes__cas_id=123) 应该可以工作
  • @Stargazer 您的查询过滤问题。因此,结果只会提出具有特定投票的问题。但我想像 SQL 查询一样得到所有问题。

标签: python sql django postgresql


【解决方案1】:

在查询中带有单独过滤器的预取应该处理这个问题:

Question.objects.all().prefetch_related(Prefetch('votes', queryset=Vote.objects.filter(cas_id=123)))

【讨论】:

  • 它有效。它产生了两次 db 命中,而不是一次,但看起来比两次单独调用 Question 和 Vote 并用手合并代码要好。谢谢。