Mysql 优化django数据库查询

Mysql 优化django数据库查询,mysql,django,django-views,Mysql,Django,Django Views,我试图在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, corrispett

我试图在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
有人处理过此类问题吗?

使用将有助于优化您的查询

有关select_related()的功能以及如何使用它的一个很好的示例,请访问

使用将有助于优化您的查询

有关select_related()的功能以及如何使用它的一个很好的示例,请访问

您可以使用返回相关对象的查询集并进一步控制操作

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'
    )
)
然后可以访问每个产品的invent,如
产品[0]。invent

可用于返回相关对象的查询集并进一步控制操作

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'
    )
)

然后您可以访问每个产品的invent,如
产品[0]。invent

我很难理解您的问题。但是对于出现在循环前面的
invents=…
fature\u lab=…
,您可以从它们中删除
.all()
。只需使用
objects.filter(…)
objects.order_by(…)
问题是我的数据处理时间太长,我认为这是由于执行了大量查询。我修改了发明和肥胖实验室,谢谢。我很难理解你的问题。但是对于出现在循环前面的
invents=…
fature\u lab=…
,您可以从它们中删除
.all()
。只需使用
objects.filter(…)
objects.order_by(…)
问题是我的数据处理时间太长,我认为这是由于执行了大量查询。我修改了发明和肥胖实验室,谢谢。