相关领域的 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)
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)