首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django_filters递归滤波

django_filters递归滤波
EN

Stack Overflow用户
提问于 2022-02-07 14:03:21
回答 1查看 96关注 0票数 0

所以我有一个django过滤器,如下所示:

代码语言:javascript
复制
class ModelFilter(FilterSet):
    user_name = CharFilter(method="some_method")
    boss = ModelChoiceFilter(...)

我的模型看起来很像这样:

代码语言:javascript
复制
class Employee(Model):
username = Charfield(...)
boss = ForeignKey("self", ''')

这样一个雇员就可以成为另一个雇员的老板。现在,此过滤器将根据用户正在搜索的值返回正确的查询集。假设我们有三个对象:

代码语言:javascript
复制
O1= Employee(usename="u1", boss=None)
O2= Employee(usename="u2", boss=O1)
O3= Employee(usename="u3", boss=O2)

如果我对这些数据应用上述过滤器,并搜索boss=O1,结果将得到对象O2。我想在过滤器中添加一个新的布尔字段,比方说"with_subordinates",如果它是真的话,它将返回整个“树”关系。例如,如果我要搜索: boss=O1,with_subordinates=True,结果应该是O2和O3。基本上,使用这个新选项,过滤器应该递归地显示员工、以前的员工等等。

有办法实现这样的目标吗?

EN

回答 1

Stack Overflow用户

发布于 2022-02-07 19:04:14

除了核心概念外,我们还会用节奏曲的方式来做。为此,我们需要从数据库中获取所有对象及其boss_id

代码语言:javascript
复制
boss_object_ids = [1,] # this is the input boss id
have_to_wait = True

while have_to_wait:
    prev_ids = boss_object_ids
    if Employee.objects.filter(boss__in=boss_object_ids).count() > 0:
    
        boss_ids_list = Employee.objects.filter(boss__in=boss_object_ids).values_list('id', flat=True)
        boss_object_ids.extend(boss_ids_list)
        boss_object_ids = list(set(boss_object_ids))
        if set(boss_object_ids) == set(prev_ids):
            have_to_wait = False
all_subordinates = Employee.objects.filter(boss__in=boss_object_ids)

解释:

第一次我们传递输入1,2,3,4,5,6.

  • Like =1或一些整数。

  • 第二次循环并找到2,3,4,5是is,因此列表将是1,2,3,4,5。

  • 第三次得到2,3,4,1,6 is,因此列表将是明智的,它将过滤直到它再次得到相同的列表。

  • ,在这个例子中,它将检查除了1,2,3,4,5,6.

  • At,没有额外的数字,我们可以使用boss_object_ids列表进行筛选。这是所需的所有下属id的名单.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71019868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档