Что такое "связанное имя", используемое в Django?
Что такое related_name
аргумент полезен для on ManyToManyField
и ForeignKey
полей? Например, учитывая следующий код, каков эффект related_name='maps'
?
class Map(db.Model):
members = models.ManyToManyField(User, related_name='maps',
verbose_name=_('members'))
3 ответов
на related_name
атрибут указывает имя обратного отношения из User
модель назад к вашей модели.
если вы не укажете related_name
, Django автоматически создает его, используя имя вашей модели с суффиксом _set
, например User.map_set.all()
.
если вы do указываете, например,related_name=maps
на User
модель User.map_set
все равно будет работать, но User.maps.
синтаксис, очевидно, немного чище и менее неуклюжий; так, например, если у вас объект пользователя current_user
, вы могли бы использовать current_user.maps.all()
чтобы получить все экземпляры Map
модель, которая имеет отношение к current_user
.
на документация Django более подробную информацию.
чтобы добавить к существующему имени, связанному с ответом, необходимо, если в модели есть 2 FKs, которые указывают на ту же таблицу. Например, в случае спецификации
@with_author
class BOM(models.Model):
name = models.CharField(max_length=200,null=True, blank=True)
description = models.TextField(null=True, blank=True)
tomaterial = models.ForeignKey(Material, related_name = 'tomaterial')
frommaterial = models.ForeignKey(Material, related_name = 'frommaterial')
creation_time = models.DateTimeField(auto_now_add=True, blank=True)
quantity = models.DecimalField(max_digits=19, decimal_places=10)
поэтому, когда вам придется получить доступ к этим данным вы можете использовать только связанное имя
bom = material.tomaterial.all().order_by('-creation_time')
он не работает иначе (по крайней мере, я не смог пропустить использование связанного имени в случае 2 FK в той же таблице.)
связанный параметр name фактически является опцией. Если мы не установим его, Django
автоматически создает для нас другую сторону отношения. В случае модели карты,
Джанго создал бы map_set
атрибут, позволяющий получить доступ через m.map_set
в
пример (M-ваш экземпляр класса). Формула Django использует это название модели с последующим
строка _set
. Таким образом, связанный параметр name просто переопределяет значение по умолчанию Django
чем обеспечение нового поведения.