【发布时间】:2017-07-21 11:40:52
【问题描述】:
函数的一部分是计算最后有效报价的数量,这些报价低于、等于和高于a_price。想不出更好的方法,所以我现在使用两个循环。问题是这会执行 575 个查询,这太多了。
一种产品可以有很多买家,而买家有很多优惠(日期时间不同)。我尝试添加prefetch_related('buyers'),但它根本没有帮助。
编辑:在这种情况下,有 32 个产品,每个产品有 0 到 30 个买家。
reset_queries()
products = Product.objects.filter(user=user)
my_active_products = products.filter(active=True).prefetch_related('buyers')
for product in my_active_products:
for buyer in product.buyers.filter(valid=True):
last_valid_offer = buyer.get_last_valid_offer()
a_price = product.a_price
if a_price:
if a_price < last_valid_offer.eur_price:
cheaper += 1
elif a_price > last_valid_offer.eur_price:
more_expensive += 1
elif a_price == last_valid_offer.eur_price:
equal += 1
else:
unknown += 1
print len(connection.queries)
你知道我应该怎么做才能减少查询次数吗?
编辑 Models.py:
class Product(Model):
name...
active = BooleanField(...)
class Buyer(Model):
product = ForeignKey('Product',related_name='buyers')
def get_last_valid_offer(self):
return self.offers.filter(valid=True).latest('datetime')
class Offer(Model):
buyer = ForeignKey('Buyer', related_name='offers')
valid = BooleanField(...)
datetime = DateTimeField(...)
eur_price = MoneyField(...)
【问题讨论】:
标签: python sql django performance django-models