在Django应用程序中,我有一组公司,其中包含过去已执行的操作历史记录。我使用以下令人讨厌的高昂Queryset检索这些事务:
class Company(AbstractBaseUser, PermissionsMixin):
...
def get_transactions_history(self):
return Transaction.objects.filter(sponsorship__campaign__shop__company=self)
显然,这会导致来自ORM的大量JOIN
指令,并且由于Transactions
的数量可能会迅速增加,因此,由于此Queryset,数据库的吞吐量也在爆炸。
假设Transaction
和Company
之间没有快捷方式,而不是通过上面公开的Sponsorship
,Campaign
和Shop
进行链接,您将如何优化没有触及数据库模式的Queryset?
答案 0 :(得分:1)
我认为你真的不能,但你可以更聪明地使用它。
Theres cached_property
@cached_property
def history(self):
它的确如此。
否则,您需要将其拆分为拼接查询集的recent_history
.filter(...)[:10]
或分页
答案 1 :(得分:0)
如果你无法在SQL级别对它进行优化,那么显然你在ORM级别上做的事情并不多。