私は各カテゴリの製品の数を取得しようとしていますが、各カテゴリは他のカテゴリの親となります。私は次のような方法で最大限のクエリを簡略化しましたが、djangoのデバッグでは、私は66クエストの重複があることを示し続けます。djangoでquerysを最適化してquerysの複製を削除する
これらの重複を削除するにはどうすればよいですか?
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(*) "web_producto" INNER FROM "__count" AS ON "web_categoria" を登録しよう"web_categoria"。 "padre_id" = '790'
( "web_producto"。 "categoria_id" = "web_categoria"。 "id") 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.10秒から945ミリ秒に、CPU使用量を435ミリ秒から345ミリ秒に減らすことが正解です。 あなたはこの結論に至った経緯をより詳しく説明してください。それについて読むことができる場所があれば、私はこの話題についてもっと学びたいと思います。質問は非常に悪いです。 – Luis
@Luis Iあなたのモデル、それが構築するdjango ormとsqlで遊んでいます。彼らが提供するquerysetとorm関数について、djangoのドキュメントと基になるデータベースについてのいくつかの本を読むことをお勧めします。 – bellum
こんにちは@bellum、今私は、15000以上の製品と2500のカテゴリを持つ関連する問題がある、あなたが言及したクエリは、ウェブを崩壊する4秒以上かかる、あなたはどのようにカテゴリとこれらの時間を避けるために、私は重要なものになる10以上の製品を持つカテゴリーだけを表示する必要があるからです。 ありがとうございます。 – Luis