关于相关领域的Django查询集

时间:2015-01-28 06:18:27

标签: django postgresql relational-database django-related-manager

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

Sentiment可能有UserCard,而我收到的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的任何建议?

1 个答案:

答案 0 :(得分:2)

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

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