¿Cuál es el related_nameargumento útil para on ManyToManyFieldy ForeignKeyfields? 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_nameasí 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_nameatributo especifica el nombre de la relación inversa desde elUsermodelo 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=mapsen elUsermodelo,User.map_setseguirá 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 suMapmodelo 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, ¿_settodavía funciona endjango1.11 >??related_namese especifica,_setya 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_namedebe ser plural. Porque las relaciones ForeignKey devuelven múltiples objetos.El
related_nameargumento 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
UserMapDataFrameobjetos relacionadosUser, la llamada predeterminada seríaUser.usermapdataframe_set.all(), que es bastante difícil de leer.El uso de le
related_namepermite 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_setatributo, permitiendo el acceso a través dem.map_seten 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_relatedse utiliza para obtener datos previos para datos de relación de Muchos a muchos y de muchos a unoselect_relatedes 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.namepero 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_relatedyselected_relatedfuente