我正在尝试将两个过滤器组合在一起,这些过滤器在一个对象中被称为FK,但我得到了错误的冗余数据。
下面是过滤器,位于views.py:
中class RecordFilter(df.FilterSet):
user = df.CharFilter(name='active_states__user', method='filter_user')
activestate = df.BooleanFilter(name='active_states__is_active', method='filter_is_active')
class Meta:
model = Record
fields = ['type', 'group', 'user', 'activestate']
def filter_user(self, queryset, _, value):
return queryset.filter(active_states__user_id=value)
def filter_is_active(self, queryset, _, value):
return queryset.filter(active_states__is_active=value)
例如,在我的测试用例中,我创建了4个记录对象,并向他们添加了activestate和user。
record1.set_active_states_for_users([user1.uuid], True)
record2.set_active_states_for_users([user1.uuid], False)
record2.set_active_states_for_users([user2.uuid], True)
record3.set_active_states_for_users([user2.uuid], False)
我尝试为user = user2和activestate = True测试这些过滤器。 而且我得到了:
结果应该只是record2。
我注意到chain
可以进行查询集的连接,但我不知道如何在RecordFilter类的views.py中使用它。你有什么线索吗?
答案 0 :(得分:2)
您的情况描述为here。可以实现此API:
class RecordFilter(df.FilterSet):
active_user = df.CharFilter(method='filter_active_user')
disabled_user = df.CharFilter(method='filter_disabled_user')
class Meta:
model = Record
fields = ['type', 'group', 'user']
def filter_active_user(self, queryset, name, value):
return queryset.filter(active_states__is_active=True,
active_states__user_id=value)
def filter_disabled_user(self, queryset, name, value):
return queryset.filter(active_states__is_active=False,
active_states__user_id=value)
因此,您可以过滤任何,仅禁用和仅启用的用户。 查询active_user = user2将只返回record2。
但我不知道您为何使用CharFilter
user
来过滤查询集active_states__user_id=value
。如果id
不是字符串,则看起来像是错误。