Django должен сделать запрос намного сложнее, чем нужно.Django queryset в связанном поле
Sentiment
может иметь User
и Card
, и я получаю Cards
, которые не находятся в пройденных User's
Sentiments
Это запрос:
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?
я бы, вероятно, написать это как 'Card.objects.all (исключают) (sentiments__user__id = user.id)'.. Это вообще помогает? –
Вы гений и ученый! Если вы ответите на вопрос, я буду отмечать его как ответ :). огромное спасибо – robert