我有我的类ClassFilter(FilterSet)和一些过滤器fx。它中的MultipleChoiceFilter、ModelMultipleChoiceFilter等:
class ClassFilter(FilterSet):
something_severity = MultipleChoiceFilter(choices=Something.SEVERITY_CHOICES, method='something_severity_filter', widget=CSVWidget)
def something_severity_filter(self, queryset, name, severities):
if severities:
queryset = queryset.filter(something_state=Something.STATE_SOMETHING)
...
return queryset
class Meta:
model = Something
fields = []当涉及到端点过滤时,它的工作原理非常完美。它被分配给类,类似于:
class ClassViewSet(mixins....., DefaultApiViewSet):
filter_class = ClassFilter通过拥有filter_class = ClassFilter。一切都很好,但现在我怀疑是否可以在ClassFilter方法中使用MultipleChoiceFilter。
这意味着,通过在POST中执行ClassViewSet方法,我希望从FilterClass中获取MultipleChoiceFilter,以便将其作为SomethingFilter.get_filters()方法在方法上筛选。
@action(detail=False, methods=['post'])
def something_update(self, req):
...
all_filters = SomethingFilter.get_filters()
for serializer_filter in serializer_filters:
for filter in all_filters:
if(serializer_filter == filter):
f = all_filters[filter]现在,f是我需要的一个过滤器,所以这就是MultipleChoiceFilter。但是当我尝试使用这个过滤器进行过滤时,它会抛出一个错误。
f.filter(queryset, [('LOW')]) #filter the queryset with the filter based on LOW choice抛出:
assertionError: Filter 'something_severity' must have a parent FilterSet to find '.something_severity_filter()'在documentation for django-filter中,它恰好是一行:https://github.com/carltongibson/django-filter/blob/f4866a9852d569861651cc733f909fe0e378131b/django_filters/filters.py#L823
所以我要说的是,如果有,就可以用像我一样的ClassFilter来过滤这样的方法。如果有其他的方法,如何真正正确地做这件事。我打赌有,所以我最终不会做其他过滤和保持低耦合。
如果有什么不清楚的地方,让我补充一下这个问题!非常感谢你的每一次帮助。
发布于 2022-11-09 09:51:45
所以我回到这个问题上,想出了一个解决办法。
在FilterSet类(MultipleChoiceFilter,.)中设置需要的筛选器时
class CarFilter(FilterSet):
wheel = MultipleChoiceFilter(choices=Wheel.CHOICES, method='wheel_filter', widget=CSVWidget)
def wheel_filter(self, queryset, name, cars):
if cars:
...
return queryset
class Meta:
model = Car
fields = []您必须在中实现过滤器类:
class CarViewSet(DefaultApiViewSet):
queryset = Car.objects.all()
serializer_class = CarSerializer
filter_class = CarFilter当您这样设置时,您可以在ViewSet方法中使用您喜欢的过滤器:
重要!-在上面的MultipleChoiceFilter中使用widget=CSVWidget时,它的工作方式如下:
def car_method(self, req):
queryset = self.filter_queryset(self.get_queryset())
self.filter_class({"wheel": "MEDIUM,LOW"}, queryset).qs当我们是而不是使用widget=CSVWidget时,它的工作方式如下:
def car_method(self, req):
queryset = self.filter_queryset(self.get_queryset())
self.filter_class({'alert_severity': ['MEDIUM', 'LOW'], 'update_state': ['is_updated']}}, queryset).qs完成了!我们根据车轮过滤汽车。
https://stackoverflow.com/questions/73526603
复制相似问题