Django select_related и поиск по полю

===Модели===

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

Я написал следующий набор запросов для извлечения полей модели (все отношения «один ко многим»)

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

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


person thchand    schedule 07.12.2011    source источник


Ответы (1)


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

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

SomeModel.objects.select_related('some_nullable_field')

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

person Chris Pratt    schedule 07.12.2011
comment
Вы только что повторили то, что я уже упоминал. Я ищу решение, а не документацию! - person thchand; 07.12.2011
comment
Решение — документация. Пока вы не следуете обратному внешнему ключу или много-ко-многим, вы можете select_related делать все, что захотите. В чем проблема? - person Chris Pratt; 07.12.2011