1

Django должен сделать запрос намного сложнее, чем нужно.Django queryset в связанном поле

Sentiment может иметь User и Card, и я получаю Cards, которые не находятся в пройденных User'sSentiments

Это запрос:

Card.objects.all().exclude(sentiments__in=user.sentiments.all())

это то, что Джанго пробеги:

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-Times , Я прочесываю сеть для ответов, но пока ничего. Любые предложения о том, как сохранить производительность, но не должны возвращаться к необработанному SQL?

+0

я бы, вероятно, написать это как 'Card.objects.all (исключают) (sentiments__user__id = user.id)'.. Это вообще помогает? –

+0

Вы гений и ученый! Если вы ответите на вопрос, я буду отмечать его как ответ :). огромное спасибо – robert

ответ

2

Лучший способ написания этого запроса без подзапросов будет:

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