我正在尝试在Django应用中优化数据库查询(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
有人解决过这种问题吗?
答案 0 :(得分:1)
使用select_related()将有助于优化查询
有关select_related()以及如何使用它的一个很好的示例,请参见simpleisbetterthancomplex。
答案 1 :(得分:1)
您可以使用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
之类的每种产品的发明