基于自定义方法筛选Django查询集的最快方法是什么?

时间:2019-05-29 21:41:26

标签: python django django-rest-framework

我有一个递归模型。我们称之为Organization。我有另一个模型,它是Organization的子代,称为Store

在应用程序中列出Store时,它是分层格式的,因此我们实际上得到了Organization,并在其下面包括了递归层次结构。在序列化程序中,我们传入参数以过滤Store,如果存储与过滤器不匹配,则返回None

但是,要注意的是,即使Organization没有Stores仍将返回,这会导致如果Store不存在,则该表将有一堆空页匹配过滤器。

为了解决这个问题,我想在视图集中根据组织是否将要拥有商店来过滤组织。

queryset = [x for x in queryset if x.will_have_store()]

def will_have_store(self):
        willHaveStore = False
        for organization in self.organizations.all():
            willHaveStore = organization.will_have_store()
            if (willHaveStore):
                return True
            if (hasattr(organization, 'store') and organization.store.id ):
                willHaveStore = True
        return willHaveStore

这确实接近工作,但是速度很慢,因为它会针对每个查询对数据库中的每一行进行递归检查。反正有什么可以使它更快?

1 个答案:

答案 0 :(得分:0)

我最终使用的解决方案是过滤所需的商店并获取组织,而不是根据商店属性过滤组织。

过滤商店
各种方法

获取所有商店的父母

all_orgs = []
for store in store_queryset:
  all_orgs.push(store.get_all_parents())

获取所有组织

queryset = Organizations.objects.filter(organization__in=all_orgs)

然后返回组织