¿Para qué se usa el` nombre relacionado ' en Django?


¿Cuál es el argumento related_name útil para los campos ManyToManyField y ForeignKey? Por ejemplo, dado el siguiente código, ¿cuál es el efecto de related_name='maps'?

class Map(db.Model):
    members = models.ManyToManyField(User, related_name='maps',
                                     verbose_name=_('members'))
Author: Serjik, 2010-04-15

3 answers

El atributo related_name especifica el nombre de la relación inversa del modelo User de vuelta al modelo.

Si no especifica un related_name, Django crea automáticamente uno usando el nombre de su modelo con el sufijo _set, por ejemplo User.map_set.all().

Si hace especificar, por ejemplo, related_name=maps en el modelo User, User.map_set seguirá funcionando, pero la sintaxis User.maps. es obviamente un poco más limpia y menos torpe; por ejemplo, si tuviera un objeto de usuario current_user, podría usar current_user.maps.all() para obtenga todas las instancias de su modelo Map que tengan una relación con current_user.

La documentación de Django tiene más detalles.

 336
Author: Wogan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-13 15:42:32

Agregar al nombre existente relacionado con la respuesta es una necesidad en caso de que haya 2 FKs en el modelo que apunten a la misma tabla. Por ejemplo, en el caso de la Lista de materiales

@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)

Así que cuando tendrá que acceder a estos datos solo puede usar el nombre relacionado

 bom = material.tomaterial.all().order_by('-creation_time')

No funciona de otra manera (al menos no pude omitir el uso de nombres relacionados en el caso de 2 FK a la misma tabla.)

 46
Author: Boris The Animal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-28 13:52:42

El parámetro nombre relacionado es en realidad una opción. Si no lo configuramos, Django crea automáticamente el otro lado de la relación para nosotros. En el caso del modelo de mapa, Django habría creado un atributo map_set, permitiendo el acceso a través de m.map_set en su ejemplo (m es su instancia de clase). La fórmula que utiliza Django es el nombre del modelo seguido por el string _set. Por lo tanto, el parámetro de nombre relacionado simplemente anula el valor predeterminado de Django que proporcionar un nuevo comportamiento.

 1
Author: Abrar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-17 08:36:48