Django调试器工具-在这种情况下如何避免for循环中重复查询

Django调试器工具-在这种情况下如何避免for循环中重复查询,django,orm,django-templates,django-views,django-debug-toolbar,Django,Orm,Django Templates,Django Views,Django Debug Toolbar,提前感谢您的回答 如何避免重复查询?如果我只查看6个产品,则需要50毫秒(重复6个查询),但当我尝试查看7000个产品时,需要的时间太长(重复7000个查询),有一种方法可以缓存所有产品,因此每次我们通过for循环时,您都必须执行查询,或者应该以另一种方式通过循环 谢谢 型号.py class TareaDeScrap(Tarea): producto = models.ForeignKey(Producto) tipo = models.CharField(max_length=20,

提前感谢您的回答

如何避免重复查询?如果我只查看6个产品,则需要50毫秒(重复6个查询),但当我尝试查看7000个产品时,需要的时间太长(重复7000个查询),有一种方法可以缓存所有产品,因此每次我们通过for循环时,您都必须执行查询,或者应该以另一种方式通过循环

谢谢

型号.py

class TareaDeScrap(Tarea):
  producto = models.ForeignKey(Producto)
  tipo = models.CharField(max_length=20, default='all')
  idioma = models.ForeignKey(Idioma)

class Dato(models.Model):
  campo = models.CharField(max_length=45)
  tarticulo = models.IntegerField(default=0)
  db_field = models.IntegerField(default=0)

  def __str__(self):
    return self.campo

class Producto(models.Model):
  tdbaseges = models.CharField(max_length=45, unique=True)
  codigo_O = models.CharField(max_length=60, null=True)
  referencia = models.CharField(max_length=500, null=True)
  codigo_limpio = models.CharField(max_length=60)
  codigo_fabricante = models.CharField(max_length=10)
  categoria = models.ForeignKey(Categoria, null=True)
  fabricante = models.ForeignKey('tarifas.Fabricante', blank=True, null=True)

class DatoProducto(models.Model):
  producto = models.ForeignKey(Producto)
  dato = models.ForeignKey(Dato)
  informacion = models.TextField()
  tarea = models.ForeignKey('main.Tarea', null=True)
tareas = TareaDeScrap.objects.filter(batch_id=batch_id, estado='SAVED').select_related("producto")

    for tarea in tareas:  

        producto_modificados.setdefault(tarea.producto.tdbaseges, {})

        datos_modificados = DatoProducto.objects.filter(producto=tarea.producto).select_related("dato")  # tarea=tarea)

        for dato in datos_modificados:

            producto_modificados[tarea.producto.tdbaseges].setdefault(dato.dato.campo, dato.informacion)
            cabeceras_productos_modificados.setdefault(dato.dato.campo, [])
视图.py

class TareaDeScrap(Tarea):
  producto = models.ForeignKey(Producto)
  tipo = models.CharField(max_length=20, default='all')
  idioma = models.ForeignKey(Idioma)

class Dato(models.Model):
  campo = models.CharField(max_length=45)
  tarticulo = models.IntegerField(default=0)
  db_field = models.IntegerField(default=0)

  def __str__(self):
    return self.campo

class Producto(models.Model):
  tdbaseges = models.CharField(max_length=45, unique=True)
  codigo_O = models.CharField(max_length=60, null=True)
  referencia = models.CharField(max_length=500, null=True)
  codigo_limpio = models.CharField(max_length=60)
  codigo_fabricante = models.CharField(max_length=10)
  categoria = models.ForeignKey(Categoria, null=True)
  fabricante = models.ForeignKey('tarifas.Fabricante', blank=True, null=True)

class DatoProducto(models.Model):
  producto = models.ForeignKey(Producto)
  dato = models.ForeignKey(Dato)
  informacion = models.TextField()
  tarea = models.ForeignKey('main.Tarea', null=True)
tareas = TareaDeScrap.objects.filter(batch_id=batch_id, estado='SAVED').select_related("producto")

    for tarea in tareas:  

        producto_modificados.setdefault(tarea.producto.tdbaseges, {})

        datos_modificados = DatoProducto.objects.filter(producto=tarea.producto).select_related("dato")  # tarea=tarea)

        for dato in datos_modificados:

            producto_modificados[tarea.producto.tdbaseges].setdefault(dato.dato.campo, dato.informacion)
            cabeceras_productos_modificados.setdefault(dato.dato.campo, [])
Django debbug工具栏sql重复

SELECT ••• FROM `importacion_datoproducto` INNER JOIN 
`importacion_dato` ON (`importacion_datoproducto`.`dato_id` = 
`importacion_dato`.`id`) WHERE 
`importacion_datoproducto`.`producto_id` = 132142
   Duplicated 6 times.

SELECT ••• FROM `importacion_datoproducto` INNER JOIN 
`importacion_dato` ON (`importacion_datoproducto`.`dato_id` = 
`importacion_dato`.`id`) WHERE 
`importacion_datoproducto`.`producto_id` = 132144
   Duplicated 6 times.  

SELECT ••• FROM `importacion_datoproducto` INNER JOIN 
`importacion_dato` ON (`importacion_datoproducto`.`dato_id` = 
`importacion_dato`.`id`) WHERE 
`importacion_datoproducto`.`producto_id` = 100613
   Duplicated 6 times.  

SELECT ••• FROM `importacion_datoproducto` INNER JOIN 
`importacion_dato` ON (`importacion_datoproducto`.`dato_id` = 
`importacion_dato`.`id`) WHERE 
`importacion_datoproducto`.`producto_id` = 100613
   Duplicated 6 times.  

 SELECT ••• FROM `importacion_datoproducto` INNER JOIN 
 `importacion_dato` ON (`importacion_datoproducto`.`dato_id` = 
 `importacion_dato`.`id`) WHERE 
 `importacion_datoproducto`.`producto_id` = 100613
   Duplicated 6 times.  

 SELECT ••• FROM `importacion_datoproducto` INNER JOIN 
 `importacion_dato` ON (`importacion_datoproducto`.`dato_id` = 
 `importacion_dato`.`id`) WHERE ` 
  importacion_datoproducto`.`producto_id` = 100613
    Duplicated 6 times.

阅读此执行
prefetch\u related
s.@WillemVanOnsem我知道我必须使用prefetch\u related,但我不知道在这种情况下是什么形式,由于信息贫乏或示例不多,我想不出方法,我尝试过不同的方法,如果你看到我的代码,你可以看到我已经使用prefetch\u related并选择prefetch\u related,我已将查询从400减少到11