Mysql 优化django数据库查询
我试图在django应用程序中优化我的db查询(mysql) 情况就是这样: 我需要每月检索一些关于销售、库存和一些产品的数据。这就是函数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
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(…)
问题是我的数据处理时间太长,我认为这是由于执行了大量查询。我修改了发明和肥胖实验室,谢谢。