1

Django 使查询变得比它需要的复杂得多。

ASentiment可能有 aUser和 a Card,而我得到的Cards是未通过的User's Sentiments

这是查询:

Card.objects.all().exclude(sentiments__in=user.sentiments.all())

这是 Django 运行的:

SELECT * FROM "cards_card" WHERE NOT ("cards_card"."id" IN ( SELECT V1."card_id" AS "card_id" FROM "sentiments_sentiment" V1 WHERE V1."id" IN ( SELECT U0."id" FROM "sentiments_sentiment" U0 WHERE U0."user_id" = 1 ) ) )

这是我想出的一个版本,它没有进行 N 次全表扫描:

Card.objects.raw(' SELECT DISTINCT "id" FROM "cards_card" WHERE NOT "id" IN ( SELECT "card_id" FROM "sentiments_sentiment" WHERE "user_id" = ' + user_id + ' ) )')

我不知道为什么 Django 必须使用 N 次扫描来完成。我一直在网上搜索答案,但到目前为止还没有。关于如何保持性能但不必回退到原始 SQL 的任何建议?

4

1 回答 1

2

在没有子查询的情况下编写此查询的更好方法是:

Card.objects.all().exclude(sentiments__user__id=user.id)
于 2015-01-28T09:08:34.400 回答