python - queryset - models django
¿Diferencia entre los atributos ''related_name'' y ''related_query_name'' en Django? (2)
¿Puede explicar la diferencia entre los related_name
y related_query_name
para el objeto Field en Django? Cuando los uso, ¿Cómo usarlos? ¡Gracias!
related_name
será el atributo del objeto relacionado que le permite ir ''hacia atrás'' al modelo con la clave externa en él. Por ejemplo, si ModelA
tiene un campo como: model_b = ForeignKeyField(ModelB, related_name=''model_as'')
, esto le permitirá acceder a las instancias de ModelA
que están relacionadas con su instancia de model_b_instance.model_as.all()
yendo model_b_instance.model_as.all()
. Tenga en cuenta que esto generalmente se escribe con un plural para una clave foránea, porque una clave foránea es una relación de uno a muchos, y el lado opuesto de esa ecuación es el modelo con el campo de la clave foránea declarado en ella.
La explicación adicional vinculada a los documentos es útil. https://docs.djangoproject.com/en/1.10/topics/db/queries/#backwards-related-objects
related_query_name
es para uso en Django querysets. Le permite filtrar en la relación inversa de un campo relacionado con clave externa. Para continuar con nuestro ejemplo, tener un campo en el Model A
como: model_b = ForeignKeyField(ModelB, related_query_name=''model_a'')
le permitiría usar model_a
como un parámetro de búsqueda en un queryset, como: ModelB.objects.filter(model_a=whatever)
. Es más común usar una forma singular para related_query_name
. Como dicen los documentos, no es necesario especificar tanto (o cualquiera de) related_name
y related_query_name
. Django tiene valores predeterminados sensibles.
class Musician(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
class Album(models.Model):
artist = models.ForeignKey(Musician, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
Aquí la relación de clave externa es Álbum a músico y la relación hacia atrás es músico a álbum. significa que una instancia de álbum puede tener relación con solo una instancia de músico (relación hacia adelante), y una instancia de músico puede relacionarse con una instancia de álbum múltiple (hacia atrás). la consulta hacia adelante será como este Album_instancia.artista, note aquí la consulta hacia adelante realizada por Album_instanc seguido por el artista (nombre del campo). y hacia atrás sería
Musician_instance.album_set.all()
aquí para la consulta hacia atrás se usa modelname_set.
ahora si especifica el nombre relacionado como artist = models.ForeignKey(Musician, on_delete=models.CASCADE, related_name=''back'')
luego, la sintaxis de la consulta hacia atrás cambiará nombre_modelo (artist.set) se reemplazará por la parte posterior. ahora consulta hacia atrás
Musician_instance.back.all()
Si prefiere que Django no cree una relación hacia atrás, establezca related_name en ''+'' o finalícelo con ''+''.
y related_query_name para usar para el nombre del filtro inverso del modelo de destino