首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"Django-filter“可以在FilterClass(FilterSet)方法中使用ViewSet MultipleChoiceFilter吗?Django 1.11,Python 2.7

"Django-filter“可以在FilterClass(FilterSet)方法中使用ViewSet MultipleChoiceFilter吗?Django 1.11,Python 2.7
EN

Stack Overflow用户
提问于 2022-08-29 09:18:10
回答 1查看 74关注 0票数 0

我有我的类ClassFilter(FilterSet)和一些过滤器fx。它中的MultipleChoiceFilterModelMultipleChoiceFilter等:

代码语言:javascript
复制
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 = []

当涉及到端点过滤时,它的工作原理非常完美。它被分配给类,类似于:

代码语言:javascript
复制
class ClassViewSet(mixins....., DefaultApiViewSet):
    filter_class = ClassFilter

通过拥有filter_class = ClassFilter。一切都很好,但现在我怀疑是否可以在ClassFilter方法中使用MultipleChoiceFilter

这意味着,通过在POST中执行ClassViewSet方法,我希望从FilterClass中获取MultipleChoiceFilter,以便将其作为SomethingFilter.get_filters()方法在方法上筛选。

代码语言:javascript
复制
@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但是当我尝试使用这个过滤器进行过滤时,它会抛出一个错误。

代码语言:javascript
复制
f.filter(queryset, [('LOW')]) #filter the queryset with the filter based on LOW choice

抛出:

代码语言:javascript
复制
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来过滤这样的方法。如果有其他的方法,如何真正正确地做这件事。我打赌有,所以我最终不会做其他过滤和保持低耦合。

如果有什么不清楚的地方,让我补充一下这个问题!非常感谢你的每一次帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-09 09:51:45

所以我回到这个问题上,想出了一个解决办法。

在FilterSet类(MultipleChoiceFilter,.)中设置需要的筛选器时

代码语言:javascript
复制
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 = []

您必须在中实现过滤器类:

代码语言:javascript
复制
class CarViewSet(DefaultApiViewSet):
    queryset = Car.objects.all()
    serializer_class = CarSerializer
    filter_class = CarFilter

当您这样设置时,您可以在ViewSet方法中使用您喜欢的过滤器:

重要!-在上面的MultipleChoiceFilter中使用widget=CSVWidget时,它的工作方式如下:

代码语言:javascript
复制
def car_method(self, req):
    queryset = self.filter_queryset(self.get_queryset())
    self.filter_class({"wheel": "MEDIUM,LOW"}, queryset).qs

当我们是而不是使用widget=CSVWidget时,它的工作方式如下:

代码语言:javascript
复制
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

完成了!我们根据车轮过滤汽车。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73526603

复制
相关文章

相似问题

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