Какой related_name
аргумент полезен для полей on ManyToManyField
и ForeignKey
? Например, с учетом следующего кода, каков эффект related_name='maps'
?
class Map(db.Model):
members = models.ManyToManyField(User, related_name='maps',
verbose_name=_('members'))
related_name
так что, если вы знаете, что не будете его использовать, я думаю, это хорошо. Это личное мнение, конечно.+
означает, что не создавать обратную связьОтветы:
related_name
Атрибут определяет имя обратной связи отUser
модели спины к вашей модели.Если вы не указать
related_name
, Django автоматически создает один , используя имя вашей модели с суффиксом_set
, напримерUser.map_set.all()
.Если же указать, например ,
related_name=maps
наUser
модели,User.map_set
все еще будет работать, ноUser.maps.
синтаксис, очевидно , немного чище и менее неуклюжим; например, если у вас есть объект пользователяcurrent_user
, вы можете использовать егоcurrent_user.maps.all()
для получения всех экземпляров вашейMap
модели, которые имеют отношение кcurrent_user
.В документации Django есть больше деталей.
источник
related_name='maps+'
в примере выше?related_name
, все_set
еще работает вdjango1.11 >
??related_name
указан,_set
больше не работает.Добавить к существующему ответу связанное имя обязательно, если в модели 2 FK, указывающих на одну и ту же таблицу. Например, в случае спецификации
Поэтому, когда вам нужно будет получить доступ к этим данным, вы можете использовать только связанное имя
Это не работает иначе (по крайней мере, я не смог пропустить использование связанного имени в случае 2 FK для одной таблицы.)
источник
related_name
должно быть во множественном числе. Потому что отношения ForeignKey возвращают несколько объектов.related_name
Аргумент также полезно , если у вас есть более сложные родственные имена классов. Например, если у вас есть отношение внешнего ключа:Для доступа к
UserMapDataFrame
объектам из связанныхUser
, вызов по умолчанию будетUser.usermapdataframe_set.all()
, который довольно сложно прочитать.Использование
related_name
позволяет вам указать более простое или более разборчивое имя, чтобы получить обратную связь. В этом случае, если вы укажетеuser = models.ForeignKey(User, related_name='map_data')
, вызов будетUser.map_data.all()
.источник
Связанный параметр имени на самом деле является опцией. Если мы не установим его, Django автоматически создаст для нас другую сторону отношения. В случае модели Map, Django создал бы
map_set
атрибут, разрешающий доступ viam.map_set
в вашем примере (m является вашим экземпляром класса). Формула, которую использует Django, - это название модели, за которым следует строка_set
. Таким образом, связанный параметр имени просто переопределяет стандартное значение Django, а не обеспечивает новое поведение.источник
prefetch_related
использовать для предварительной выборки данных для данных «многие ко многим» и «многие к одному».select_related
это выбрать данные из одного значения отношения. Оба они используются для извлечения данных из их отношений из модели. Например, вы строите модель и модель, которая связана с другими моделями. Когда приходит запрос, вы также запрашиваете данные об их отношениях, и у Django есть очень хорошие механизмы для доступа к данным из их отношений, например,book.author.name
но когда вы выполняете итерацию списка моделей для извлечения данных об их отношениях, Django создает каждый запрос для каждой отдельной информации об отношениях. Чтобы преодолеть это у нас естьprefetchd_related
иselected_related
источник