我试图获得每个类别的产品数量,但每个类别又是其他类别的父级,所以我想知道有多少孩子拥有该类别及其子类别,我已经简化了以下列方式查询到最大值,但在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()
答案 0 :(得分:0)
您可以使用cat_padre
和Count
使用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。我已经对假数据进行了测试,所以请比较一下你之前得到的内容以及返回此查询的内容。