相关领域的 Django 查询集

Django queryset on related field

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

A 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 次完整 table 扫描:

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?

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

Card.objects.all().exclude(sentiments__user__id=user.id)