Django -filter получает все записи, когда задано значение c для поля filter_ - PullRequest
1 голос
/ 10 февраля 2020

Я использую django -фильтр для фильтрации моих Queryset на основе параметров URL.

class WorklistViewSet(ModelViewSet):


    serializer_class = MySerializer
    queryset = MyModel.objects.all()

    filter_backends = [DjangoFilterBackend, ]
    filterset_fields = ['class', ]
    # possible values of *class* which is allowed to be passed in the url params are ['first', 'second', 'ALL']. 

class MyModel(BaseModel):
       CLASS_CHOICES = (
        (FIRST_CLASS, 'first'),
        (SECOND_CLASS, 'second'),
    )
       class = models.CharField(choices=CLASS_CHOICES, max_length=3, )

URL-адреса http://127.0.0.1:8000?class=first и http://127.0.0.1:8000?class=first дают ожидаемые результаты.

Я хочу, чтобы при вызове http://127.0.0.1:8000?class=ALL были перечислены все записи в моей таблице, т.е. без фильтрации .

Как я могу сделать это при использовании django-filter?

1 Ответ

1 голос
/ 11 февраля 2020

Вы можете использовать Filter.method, как описано в документах .

В вашем случае я бы сделал следующее:

class F(django_filters.FilterSet):
    klass = CharFilter(method='my_custom_filter')

    class Meta:
        model = MyModel
        fields = ['klass']

    def my_custom_filter(self, queryset, name, value):
        if value == 'ALL':
            return queryset
        return queryset.filter(**{
            name: value,
        })

Be также напомнил, что class является зарезервированным словом в Python и не может использоваться в качестве имени переменной. Вместо этого я использовал klass, хотя во многих книгах Python это используется как-то еще и может сбить с толку.

...