所以我有一个django过滤器,如下所示:
class ModelFilter(FilterSet):
user_name = CharFilter(method="some_method")
boss = ModelChoiceFilter(...)我的模型看起来很像这样:
class Employee(Model):
username = Charfield(...)
boss = ForeignKey("self", ''')这样一个雇员就可以成为另一个雇员的老板。现在,此过滤器将根据用户正在搜索的值返回正确的查询集。假设我们有三个对象:
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。基本上,使用这个新选项,过滤器应该递归地显示员工、以前的员工等等。
有办法实现这样的目标吗?
发布于 2022-02-07 19:04:14
除了核心概念外,我们还会用节奏曲的方式来做。为此,我们需要从数据库中获取所有对象及其boss_id。
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.
boss_object_ids列表进行筛选。这是所需的所有下属id的名单.https://stackoverflow.com/questions/71019868
复制相似问题