Что такое "связанное имя", используемое в Django?
Что такое related_name
аргумент полезен для on ManyToManyField
и ForeignKey
полей? Например, учитывая следующий код, каков эффект related_name='maps'
?
class Map(db.Model):
members = models.ManyToManyField(User, related_name='maps',
verbose_name=_('members'))
3 ответа:
The
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
.The документация 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 в той же таблице.)
параметр связанное имя на самом деле является опцией. Если мы не установим его, Django автоматически создает другую сторону отношения для нас. В случае модели карты, Джанго бы создал
map_set
атрибут, разрешающий доступ черезm.map_set
в пример (m - ваш экземпляр класса). Формула, которую использует Django-это имя модели, за которым следует строка_set
. Таким образом, связанный параметр name просто переопределяет значение по умолчанию Django чем обеспечение нового поведения.