Django: Возможно ли достичь того же, что существует в sql? - PullRequest
3 голосов
/ 20 марта 2012

Чтобы сделать мой вопрос более понятным, вот пример.

Существует две модели:

class A(models.Model):
    name = models.CharField(max_length = 10)

class B(models.Model):
    a = models.ForeignKey(A)
    name = models.CharField(max_length = 10)

Так что в этом примере A и B имеют отношение один ко многим,Теперь предположим, что я хотел бы сделать следующий запрос: найти A, у которого хотя бы один B является дочерним.В SQL, очевидно, я должен использовать существующее предложение.Можно ли добиться того же с помощью orm?

Я провел некоторое исследование по этому вопросу, но не могу найти идеального соответствия с запросом sql.Ближайшее решение выглядит так:

A.objects.filter(b__pk__gt = 0).distinct()

Но оно все еще далеко от существующего в sql предложения и может быть не таким эффективным, как существует.

Ответы [ 2 ]

1 голос
/ 20 марта 2012

На самом деле (если я не неправильно понял, что вы пытаетесь сделать) с простым sql, простое левое объединение было бы способом вместо предложения EXISTING.

Ваш набор запросов работает просто отлично без.different ()

Я рекомендую вам взглянуть на запросы, которые генерирует django orm, чтобы вы могли увидеть, что происходит, и запустить ANALYZE / EXPLAIN вместо того, чтобы угадывать производительность.

Вы можете увидеть необработанный запрос из атрибута запроса набора запросов или, что еще лучше, установить панель отладки django и просмотреть все запросы для данного запроса.

1 голос
/ 20 марта 2012

Следующее выберет все A s, с которыми связан один или несколько B s:

A.objects.filter(b__isnull=False)

При переключении на b__isnull=True будут выбраны только A с, с которыми не связано B с.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...