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

2024-09-29 23:22:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

但是,问题是Organization仍然会返回,即使它没有Stores,如果Store与筛选器不匹配,这会导致表有一堆空页

为了解决这个问题,我想在viewset中根据组织是否有商店来过滤它们

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

这非常接近工作状态,但速度非常慢,因为它对数据库中的每一行的每一个查询都进行递归检查。有没有办法让这更快


Tags: storein模型selfforreturnif层次结构
1条回答
网友
1楼 · 发布于 2024-09-29 23:22:37

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

筛选存储
有多种方法可以做到这一点

找到所有商店的家长

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

获取所有组织

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

然后返回组织

相关问题 更多 >

    热门问题