¿Cuál es el related_name
argumento útil para on ManyToManyField
y ForeignKey
fields? 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'))
related_name
así que si sabes que no lo usarás, supongo que es algo bueno. Esa es una opinión personal, por supuesto.+
significa no crear una relación inversaRespuestas:
El
related_name
atributo especifica el nombre de la relación inversa desde elUser
modelo hasta su modelo.Si no especifica un
related_name
, Django crea automáticamente uno usando el nombre de su modelo con el sufijo_set
, por ejemploUser.map_set.all()
.Si lo especifica, por ejemplo,
related_name=maps
en elUser
modelo,User.map_set
seguirá funcionando, pero laUser.maps.
sintaxis es obviamente un poco más limpia y menos torpe; así, por ejemplo, si tuviera un objeto de usuariocurrent_user
, podría usarlocurrent_user.maps.all()
para obtener todas las instancias de suMap
modelo con las que tenga relacióncurrent_user
.La documentación de Django tiene más detalles.
fuente
related_name='maps+'
en el ejemplo anterior?related_name
, ¿_set
todavía funciona endjango1.11 >
??related_name
se especifica,_set
ya no funciona.Para agregar a la respuesta existente, el nombre relacionado es imprescindible en caso de que haya 2 FK en el modelo que apunten a la misma tabla. Por ejemplo en caso de lista de materiales
Entonces, cuando tenga que acceder a estos datos, solo puede usar el nombre relacionado
De lo contrario, no funciona (al menos no pude omitir el uso del nombre relacionado en el caso de 2 FK en la misma tabla).
fuente
related_name
debe ser plural. Porque las relaciones ForeignKey devuelven múltiples objetos.El
related_name
argumento también es útil si tiene nombres de clase relacionados más complejos. Por ejemplo, si tiene una relación de clave externa:Para acceder a los
UserMapDataFrame
objetos relacionadosUser
, la llamada predeterminada seríaUser.usermapdataframe_set.all()
, que es bastante difícil de leer.El uso de le
related_name
permite especificar un nombre más simple o más legible para obtener la relación inversa. En este caso, si especificauser = models.ForeignKey(User, related_name='map_data')
, la llamada sería entoncesUser.map_data.all()
.fuente
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
map_set
atributo, permitiendo el acceso a través dem.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
. El parámetro de nombre relacionado simplemente anula el valor predeterminado de Django en lugar de proporcionar un nuevo comportamiento.fuente
prefetch_related
se utiliza para obtener datos previos para datos de relación de Muchos a muchos y de muchos a unoselect_related
es seleccionar datos de una relación de valor único. Ambos se utilizan para obtener datos de sus relaciones de un modelo. Por ejemplo, crea un modelo y un modelo que tiene una relación con otros modelos. Cuando llegue una solicitud, también consultará sus datos de relación y Django tiene mecanismos muy buenos para acceder a los datos de su relación,book.author.name
pero cuando itera una lista de modelos para recuperar sus datos de relación, Django crea cada solicitud para cada dato de relación. Para superar esto tenemosprefetchd_related
yselected_related
fuente