优化django数据库查询

yhived7q  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(329)

我试图在django应用程序中优化我的db查询(mysql)。
情况如下:
我需要每月检索一些销售数据,一些产品的库存数据。这就是函数

def get_magazzino_month(year, month):
    from magazzino.models import ddt_in_item, omaggi_item, inventario_item
    from corrispettivi.models import corrispettivi_item, corrispettivi
    from fatture.models import fatture_item, fatture, fatture_laboratori_item
    from prodotti.models import prodotti
    qt = 0
    val = 0

    products = prodotti.objects.all()
    invents = inventario_item.objects.all().filter(id_inventario__data__year=year-1)
    fatture_lab = fatture_laboratori_item.objects.all().order_by("-id_fattura__data")

    for product in products:
        inv_instance = filter_for_product(invents, product)
        if inv_instance:
            qt += inv_instance[0].quantita
        lab_instance = fatture_lab.filter(id_prodotti=product).first()
        prezzo_prodotto = (lab_instance.costo_acquisto/lab_instance.quantita - ((lab_instance.costo_acquisto/lab_instance.quantita) * lab_instance.sconto / 100)) if lab_instance else product.costo_acquisto
    return val, qt

问题是我需要过滤所有的数据,只得到我需要的产品。似乎.filter选项使django重新查询数据库,尽管所有的数据都在那里。我试着自己做一个函数来过滤它,但是尽管查询减少了,加载时间却急剧增加。
这是要筛选的函数:

def filter_for_product(array, product):
    result = []
    for instance in array:
        if instance.id_prodotti.id == product.id:
            result.append(instance)
    return result

有人处理过这种问题吗?

vbkedwbf

vbkedwbf1#

使用select\u related()将有助于优化查询
SimplesBetterThanComplex提供了一个很好的示例,说明select\u related()的作用以及如何使用它。

bq9c1y66

bq9c1y662#

你可以用 prefetch_related() 返回相关对象的查询集 Prefetch() 进一步控制操作。

from django.db.models import Prefetch

products = prodotti.objects.all().annotate(
    Prefetch(
        'product_set',
        queryset=inventario_item.objects.all().filter(id_inventario__data__year=year-1),
        to_attr='invent'
    )
)

然后您可以访问每个产品的 products[0].invent

相关问题