Что такое "связанное имя", используемое в Django?


Что такое related_name аргумент полезен для on ManyToManyField и ForeignKey полей? Например, учитывая следующий код, каков эффект related_name='maps'?

class Map(db.Model):
    members = models.ManyToManyField(User, related_name='maps',
                                     verbose_name=_('members'))
3 238

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 чем обеспечение нового поведения.