es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo optimizar una consulta de clave externa inversa en DjangoORM

Tengo las siguientes relaciones:

Estoy tratando de seleccionar todas las tareas con todas sus instancias y su vehículo. Sin embargo, esta consulta es muy lenta.

Según mi entendimiento, debo usar prefetch_related porque es una relación de uno a muchos.

Mi modelo de instancia tiene una clave externa inversa a la tarea:

task = models.ForeignKey(TaskModel, on_delete=models.CASCADE, related_name=”instances”)

He intentado una consulta como esta en DjangoORM:

TaskModel.objects.filter(department_id=department_id).prefetch_related(“instances”, “instances__vehicle”)

Pero es muy lenta. ¿Hay alguna forma de optimizar esto o la relación restringe inherentemente este patrón de consulta?

Corriendo en Django 3.x

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Dado que la relación entre TaskModel, InstanceModel y VehicleModel es de Muchos a Muchos, es recomendable utilizar select_related en lugar de prefetch_related para mejorar el rendimiento.

    Puedes utilizar select_related para seleccionar todos los campos relacionados en una sola consulta. Aquí tienes un ejemplo de consulta:

    TaskModel.objects.filter(department_id=department_id).select_related('instances__vehicle')
    

    Esto recuperará todas las tareas para un id de departamento dado y también todas las instancias relacionadas con sus correspondientes vehículos. Esto resultará en solo dos consultas SQL, una para TaskModel y otra para InstanceModel y VehicleModel relacionados.

    Además, asegúrate de tener índices en los campos de clave foránea en las tablas de tu base de datos para optimizar aún más el rendimiento de la consulta.

Comments are closed.