Django使查询变得比它需要的复杂得多。
Sentiment
可能有User
和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的任何建议?
答案 0 :(得分:2)
在没有子查询的情况下编写此查询的更好方法是:
Card.objects.all().exclude(sentiments__user__id=user.id)