¿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'))
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.
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.)
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.
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