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 的任何建议?