Обратная связь Django с select_related - PullRequest
8 голосов
/ 11 ноября 2011

У меня есть 4 модели, и я хочу получить соединение между ними

ModelA

class ModelA(models.Model):
    product = models.ForeignKey(ModelB)
    group = models.ForeignKey(Group)

ModelB

class ModelB(models.Model):
    title = models.CharField()

ModelC

class ModelC(models.Model):
    product = models.ForeignKey(ModelB)
    group = models.ForeignKey(ModelD)

ModelD

class ModelD(models.Model):
    name = models.CharField()

Теперь я хочу, чтобы все мои ModelA объекты были объединеныс ModelB , ModelC и ModelD В sql это довольно легко сделать.Просто сделайте соединения между таблицами.С Django ORM я застрял, потому что я могу сделать только прямое отношение.

Я делаю это

ModelA.objects.all().select_related(product)

Но я не могу присоединиться к ModelC, я уже прочитал этостатья , но я не хочу перебирать свой большой список, чтобы сделать простую вещь!И я хочу попасть в базу данных только один раз.

Я использую последнюю версию Django и надеюсь, что уже есть решение, о котором я не знаю.

Спасибовы.

Ответы [ 2 ]

8 голосов
/ 11 ноября 2011

См. Документы по prefetch_related .Он только на данный момент, но выйдет с Django 1.4.Если вы можете подождать или вы можете бежать по стволу.Вы сможете использовать это.

А пока вы можете попробовать django-batch-select .По сути, это служит той же цели.

3 голосов
/ 11 ноября 2011

Редактировать: после перечитывания проблемы решение не так просто.

документы говорят:

select_related ограничен однозначными отношениями - внешний ключ и один к одному.

Наборы запросов Django 1.4 будут иметь prefetch_related метод, который вы обязательно должны прочитать. Похоже, что вы не сможете сделать это за один запрос, но вы можете сделать это за 2 или 3. Вы обязательно должны взглянуть и перейти на версию dev, если вам это действительно нужно.

Если вы не можете использовать версию dev и не можете ждать 1.4, django также поддерживает пользовательские запросы SQL .

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