django中查询的优化消除了查询重复

时间:2017-12-26 16:52:24

标签: django

我试图获得每个类别的产品数量,但每个类别又是其他类别的父级,所以我想知道有多少孩子拥有该类别及其子类别,我已经简化了以下列方式查询到最大值,但在django调试中我一直显示我有66个查询重复。

如何消除这些重复?

使用views.py的第一行,他设法获得了一个类别中的产品数量,但问题主要是告诉他让我退出该类别和他的女儿。

models.py

class Categoria(models.Model):
   nombre = models.CharField(max_length=200)
   slug = models.SlugField(max_length=100)
   padre = models.ForeignKey('self', blank=True, null=True, 
           related_name='cat_padre')
   pub_date = models.DateTimeField('date published', 
                                    auto_now_add=True)
   upd_date = models.DateTimeField('date updated', auto_now=True)

   def __str__(self):
       return self.nombre + ' ' + self.pais.iso

class Producto(models.Model):
   nombre = models.CharField(max_length=200)
   slug = models.SlugField(max_length=100)
   categoria = models.ForeignKey(Categoria)

views.py

cats = Categoria.objects.annotate(num_productos=Count('producto')).filter(pais__iso=pais, padre__isnull=True).order_by('-num_productos')

for c in cats:
     num_p = Producto.objects.filter(categoria__padre=c).count()
     c.num_productos += num_p

 contexto = {
    'categorias_padre': cats,
}

return render(request, 'web/pruebitas/product.html', contexto)

Django调试:

SELECT COUNT(*)AS" __ count" FROM" web_producto" INNER JOIN" web_categoria" ON(" web_producto"。" categoria_id" =" web_categoria"。" id")WHERE" web_categoria"。&# 34; padre_id" =' 790'

重复62次。

Conexión: default
/home/luis/PycharmProjects/lco_web/web/middleware.py in __call__(29)
  response = self.get_response(request)
/home/luis/PycharmProjects/lco_web/web/views.py in index(11)
  return categoria(request, '', '/')
/home/luis/PycharmProjects/lco_web/web/views.py in categoria(170)
  'categorias': categorias(pais, categoria.id if categoria else 0),
/home/luis/PycharmProjects/lco_web/web/views.py in categorias(29)
  num_p = Producto.objects.filter(categoria__padre=c).count()

1 个答案:

答案 0 :(得分:0)

您可以使用cat_padreCount使用distinct=True对子类别进行反向查找来实现此目的。

cats = Categoria.objects.annotate(
    num_productos=Count('cat_padre__producto', distinct=True) + 
                  Count('producto', distinct=True)).filter(
                      pais__iso=pais, padre__isnull=True).order_by('-num_productos')

P.S。我已经对假数据进行了测试,所以请比较一下你之前得到的内容以及返回此查询的内容。