python - practices - ¿Para qué se utiliza `related_name` en Django?
related_name django (3)
¿Para qué es útil el argumento ManyToManyField
en 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''))
El atributo related_name
especifica el nombre de la relación inversa del modelo de User
a su 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 especifica, por ejemplo, related_name=maps
en el modelo de User
, User.map_set
seguirá funcionando, pero User.maps.
la sintaxis es obviamente un poco más limpia y menos torpe; así, por ejemplo, si tuviera un objeto de usuario current_user
, podría usar current_user.maps.all()
para obtener todas las instancias de su modelo de Map
que tengan una relación con current_user
.
La documentación de Django tiene más detalles.
El parámetro de 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 Map, 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 usa Django es el nombre del modelo seguido de la cadena _set
. Por lo tanto, el parámetro de nombre relacionado simplemente reemplaza el valor predeterminado de Django en lugar de proporcionar un nuevo comportamiento.
Para agregar a la respuesta existente, el nombre relacionado es una necesidad en caso de que haya 2 FK en el modelo que apunten a la misma tabla. Por ejemplo en caso de factura de material.
@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)
Entonces, cuando tenga 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 del nombre relacionado en el caso de 2 FK en la misma tabla).