根据请求自定义django-filter ModelChoiceFilter(select)和ModelMultipleChoiceFilter(多选)菜单中的查询集

问题描述 投票:0回答:1

我在2个地方使用django-filter:我的Django Rest Framework API,以及我的FilterViews(Django Filter的Generic ListViews。)在我的FilterViews的情况下,我显示选择框(ModelChoiceFilter)和多选框(ModelMultipleChoiceFilter)过滤。

我需要能够根据请求中的字段限制那些选择和多选输入中的内容。

在FilterSet的相关字段中更改列为kwarg的内容相对简单。例如,这是我的FilterSet,其中queryset被设置为kwarg:

class FieldFilter(django_filters.FilterSet):
    """Filter for the field list in the API"""
    dataset = ModelChoiceFilter(queryset=Dataset.objects.all())

    class Meta(object):
        """Meta options for the filter"""
         model = Field
         fields = ['dataset']

并且在get_queryset()方法中限制DRF中的结果是相对简单的。例如,这是我的DRF ViewSet:

class FieldViewSet(viewsets.ReadOnlyModelViewSet):
    """A ViewSet for viewing dataset fields"""
    queryset = Field.objects.all()
    serializer_class = FieldSerializer
    filter_class = FieldFilter

    def get_queryset(self):
        """Get the queryset"""
        queryset = super(FieldViewSet, self).get_queryset()

        queryset = queryset.filter(
            dataset__organization=self.request.organization)

        return queryset

当显示视图时,我找不到任何地方可以在Dataset中编辑filter_class字段。

这在Django FormView通用视图中非常简单,但似乎FieldViewSet遵循与通用视图相同的get_form()结构。在管理员中做的也相对简单,但DRF / Django-Filter似乎也没有遵循这种结构。

有没有办法在每个请求的基础上自定义这些输入中的查询集?最好是在FilterViews和HTML API浏览器中,但只是在FilterViews中,如果它对HTML API浏览器来说太复杂了就没问题。

django django-rest-framework django-filter
1个回答
2
投票

我也在找到解决方案时遇到了问题。

我通过以下方式解决了(我认为):

views.朋友

table_filter = ExampleFilter(request.GET, kwarg_I_want_to_pass=request.user, queryset=qs)

filters.朋友

class ExampleFilter(django_filters.FilterSet):

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('kwarg_I_want_to_pass', None)
        super(ExampleFilter, self).__init__(*args, **kwargs)

        self.filters['field_to_filter'].extra.update({
           'queryset': Supplier.objects.filter(related_user=self.user),
           'empty_label': '',
           'help_text': False
        })

    class Meta:
        model = ExampleModel
        fields = ['related_user', 'field_to_filter', ... other fields]
© www.soinside.com 2019 - 2024. All rights reserved.