El atributo related_name especifica el nombre de la relación inversa desde el modelo de Usuario hasta su modelo. Si no especifica un nombre_relacionado, Django crea uno automáticamente usando el nombre de su modelo con el sufijo _set.
Sintaxis:
field_name = models.Field(related_name="name")
Explicación:
Ilustración de related_name=”name” utilizando un ejemplo. Considere un proyecto llamado suorganizer (organizador de inicio) que tiene una aplicación llamada organizador.
Refer to the following articles to check how to create a project and an app in Django. How to Create a Basic Project using MVT in Django ? How to Create an App in Django ?
Ingrese el siguiente código en el archivo models.py de la aplicación del organizador.
Python
from django.db import models # Create your models here. class Tag(models.Model): name = models.CharField(max_length = 31) def __str__(self): return self.name.title() class Post(models.Model): title = models.CharField(max_length = 63) tags = models.ManyToManyField(Tag, related_name ='blog_posts') def __str__(self): return self.title
Después de ejecutar makemigrations y migrar en Django y renderizar el modelo anterior, intentemos crear una instancia usando None from Django shell. Para iniciar Django shell, ingrese el comando.
Python manage.py shell
Ahora intentemos crear una instancia de Etiqueta y Publicación usando Ninguno.
# importing required model from organizer.models import Tag, Post # creating instance of Tag model r = Tag.objects.create(name ="django") r.save() # creating instance of Post model s = Post.objects.create(title ="About django") s.save() # accessing objects t = Tag.objects.get(name ="django") p = Post.objects.get(title ="About django") # method1--adding tag to post using post object p.tags.add(t) # method2--adding tag to post using tag object # which is possible with related_name t.blog_posts.add(p)
Verifiquemos en la interfaz de administración si se crea la instancia del modelo.
1. Etiquetar objeto:
2. Publicar objeto
En Django solo especificamos relaciones simétricas en un solo lugar. El parámetro related_name es lo que define el otro lado de una relación. Concretamente, dada una instancia de publicación p, las etiquetas asociadas con esta publicación son accesibles a través de p.tags. Sin embargo, dada una instancia de Tag t, no habíamos definido explícitamente una variable para acceder a los objetos Post. Gracias a la opción related_name, ahora podemos acceder a la lista de publicaciones de blog relacionadas con la etiqueta t a través del atributo de publicaciones de blog, como en t.blog_posts. El parámetro _name 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 Tag, Django habría creado un atributo post_set, permitiendo el acceso a través de t.post_set en nuestro ejemplo. La fórmula que utiliza Django es el nombre del modelo seguido de string_set.