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