Обратная связь Django с select related

у меня есть 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 ответов


посмотреть документы на prefetch_related. Это dev только на данный момент, но ударит с Django 1.4. Если вы можете подождать или вы можете работать на багажнике. Ты сможешь это использовать.

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


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

на docs говорят:

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

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

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