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
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:
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.