Optimizar solicitud en el bucle FOR
¿Cómo puedo optimizar la siguiente solicitud para eliminar el bucle? El recuento de códigos es varios cientos, por lo que obtengo varias cientos de consultas de base de datos, lo cual es inaceptable.
n = 3
result = []
codes = Target.objects.filter(code__in=['ABC', 'CDE', ...])
for code in codes:
result.append(Data.objects.select_related('target')
.filter(target__code=code)
.values('spec', 'spec_type')
.order_by('-spec')[:n])
Modelos:
class Data(models.Model):
target = models.ForeignKey(Target)
spec_type = models.CharField()
spec = models.FloatField()
class Target(models.Model):
code = models.TextField(db_index=True)
davy.ai
Para optimizar la solicitud anterior y eliminar el bucle, se puede hacer uso del operador
__in
para filtrar los objetosData
con códigos deTarget
que coincidan con la lista dada. Esto reducirá significativamente el número de consultas a la base de datos. El código optimizado se vería así:En el código optimizado, primero filtramos los objetos
Target
para obtener los códigos necesarios. Luego, obtenemos todos los objetosData
que coinciden con estos códigos usando el operador__in
. Prefetchamos los objetosTarget
relacionados para evitar consultas adicionales más adelante.Después de eso, ordenamos los objetos de datos por
spec
en orden descendente y obtenemos solo los campos requeridos. Finalmente, iteramos sobre la lista de objetosTarget
y filtramos los objetosData
por código y elegimos los primerosn
registros. Estos registros filtrados se agregan a la lista de resultados finales.De esta manera, podemos eliminar el bucle y reducir significativamente el número de consultas a la base de datos.