Что такое "связанное имя", используемое в 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 чем обеспечение нового поведения.