在 Django 应用程序中,我有四个模型——“提案”、“提案修订”、“意见”和“用户”。以下是简化的定义:
class User(models.Model):
pass
class Proposal(models.Model):
pass
class ProposalRevision(models.Model):
proposal = models.ForeignKey(Proposal)
created = models.DateTimeField()
class Opinion(models.Model):
user = models.ForeignKey(User)
proposal = models.ForeignKey(Proposal)
created = models.DateTimeField()
每个提案可能有多次修改;并且用户可能对给定的提案有很多意见。我想做的查询是:
检索自上次提案修订创建以来给定用户未发表意见的所有提案。
应用程序用例是我想向用户展示他们需要发表意见的建议。
天真地,我想以这种方式进行查询:
Proposal.objects.annotate(
latest_revision=Max('proposalrevision__created')
).exclude(
opinion__user=user,
opinion__created__lte=F('latest_revision')
)
为了使用“额外”查询来解决这个问题,我开始尝试编写普通 SQL 来执行我想要的查询,但是我在 'where' 子句中使用聚合时遇到了困难。我正在使用的 SQL 如下所示:
SELECT ...snip..., MAX("proposal_proposalrevision"."created") as "latest_revision"
FROM "proposal_proposal"
LEFT OUTER JOIN "proposal_proposalrevision" ON
("proposal_proposal"."id" = "proposal_proposalrevision"."proposal_id")
WHERE "proposal_proposal"."id" NOT IN (
SELECT (U1."proposal_id") FROM "proposal_opinion" U1
WHERE (
U1."user_id" = 1 AND U1."proposal_id" IS NOT NULL AND
U1."created" > "latest_proposal"
)
)
GROUP BY ...snip...
SQLite 给了我错误“ misuse of aggregate: MAX()
”。这适用于我是否使用变量名称“ latest_proposal
”,或者将其替换为聚合函数的重复MAX("proposal_proposalrevision"."created")
。
我还能如何构建此查询以使用聚合过滤返回的集合?