Django select_related и поиск по полю - PullRequest
0 голосов
/ 07 декабря 2011

=== Модель ===

class A(models.Model):
     name= models.CharField(max_length=20, blank=False)

Class B(models.Model):
     university = models.CharField(max_length=25, blank=False)
     location = models.CharField(max_length=30, blank=False)
     b_fk= models.ForeignKey(A)

Class C(models.Model):
     studentclass = models.CharField(max_length=10, blank=False)
     section = models.CharField(max_length= 10)
     c_fk = models.ForeignKey(B)

class Cfurther(models.Model):
     branch= Models.CharField(max_length=15, blank=Flase)
     number = models.IntegerField()
     cfur_fk = models.ForeignKey(C)

class Info(models.Model):
     info_number = models.IntegerField()
     info = models.CharField(max_length= 12, blank=Flase)
     info_fk = models.ForeignKey(B, related_name= "info_set")

class Infocategory(models.Model):
     find = models.CharField(max_length=15, blank=False)
     cat_fk = models.ForeignKey(Info)

class Extra(models.Model):
     extrainfo = models.CharField(max_length=30)
     extra_fk = models.ForeignKey(Infocategory)

=== Посмотреть ===

Документация Django

Возвращает QuerySet, который автоматически «следует» за внешним ключом отношения, выбирая эти дополнительные данные связанных объектов, когда это выполняет свой запрос.

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

https://docs.djangoproject.com/en/dev/ref/models/querysets/#select-related

Я написал Follow Queryset для выборки полей модели (все отношения один-ко-многим)

myquery = Info.objects.select_related().filter(info_number__iexact = 123)
  • Я хочу пройти от Инфо-модель к Верхней и Нижней моделям
  • У меня нет проблем с получением записей класса A с select_related () в шаблоне, но возможно ли получить все поля модели с select_related в моем случае (класс B C, Далее, Инфокатегория, Дополнительно)?
  • Если нет, нужно ли создавать новый набор запросов? или что select_related () будет работать?

Я немного запутался в отношении select_related поиск полей

1 Ответ

4 голосов
/ 07 декабря 2011

Вы можете проходить через все отношения настолько глубоко, насколько хотите, просто через стандартный API Django. select_related не делает ничего особенного в установлении отношений; он просто позволяет вам уменьшить количество запросов к БД, выполняя заранее соединения (вместо того, чтобы искать каждый внешний ключ по мере его обращения).

Однако, как указано в документации, select_related работает только с внешними ключами и OneToOneFields. Это не работает с ManyToManyFields вообще. Кроме того, вы можете отслеживать обратную связь только с select_related, если это OneToOneField. Обратные ForeignKeys не поддерживаются. Наконец, по умолчанию select_related следует только за полями, которые имеют null=False. Если это поле с нулевым значением, вы должны явно указать select_related, что следует за ним:

SomeModel.objects.select_related('some_nullable_field')

Как только Django 1.4 попадет, вы получите доступ к новому методу prefetch_related, который работает как select_related, но поддерживает ManyToManyFields и обратные отношения ForeignKey.

...