Настройте набор запросов в меню django-filter ModelChoiceFilter (select) и ModelMultipleChoiceFilter (multi-select) на основе запроса - PullRequest
0 голосов
/ 07 мая 2018

Я использую django-фильтр в 2 местах: мой Django Rest Framework API и в моих FilterViews (универсальные ListViews фильтра Django.) В В случае моих FilterView я показываю как блоки выбора ( ModelChoiceFilter ), так и блоки множественного выбора (ModelMultipleChoiceFilter) для фильтрации.

Мне нужно иметь возможность ограничить количество входов для выбора и множественного выбора на основе поля внутри запроса.

Относительно просто изменить то, что указано как kwarg в соответствующем поле в FilterSet. Например, вот мой FilterSet, где набор запросов установлен как 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']

И относительно просто ограничить, какой результат находится в DRF внутри метода get_queryset(). Например, вот мой 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.

1 Ответ

0 голосов
/ 31 августа 2018

У меня также были проблемы с поиском разрешения.

Я решил (думаю) через следующее:

views.py

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

filters.py

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]
...