Многополевая фильтрация Django в POST - PullRequest
0 голосов
/ 20 октября 2018

У меня есть ресторанный стол с полями, такими как kitchen_type и outlet_type, у которого kitchen_type есть таблица Kitchen (pk, kitchen_type), а у outlet_type есть таблица Outlet (pk, outlet_type).Есть больше полей, таких как is_vegeterian_friendly, доступность и так далее.Пользователь может выбрать любое поле для фильтрации, и я не хочу создавать комбинацию полей для обработки каждого запроса.Это безумие.

Пользователь может применить фильтр к любому полю в теле запроса POST, как показано ниже:

{
    "outlet_type":  1, 
    "cuisine_type": 2,
    ...
}

Представление вернет список ресторанов после фильтра

class RestaurantList(APIView):
    def post(self, request, format=None):
        filter = dict(request.data)
        retaurants = Restaurant.objects.filter(**filter)
        serializer = RestaurantSerializer(retaurants, many=True)
        return Response(serializer.data)

Однако, когда, например, в одном поле есть несколько вариантов выбора, они хотят отфильтровать несколько типов kitchen_type, таких как 1 и 2, тогда тело запроса должно добавить __in, чтобы оно работало.

{
    "outlet_type":  1, 
    "cuisine_type__in": [1, 2],
    ...
}

Есть ли лучший способ сделать это?Я ожидаю, что нам не нужно изменять имя ключа, и мы просто создаем значение в виде массива, например:

{
    "outlet_type":  1, 
    "cuisine_type": [1, 2],
    ...
}

1 Ответ

0 голосов
/ 28 октября 2018

Вы должны попробовать django-filter lib для фильтрации.Он довольно прост в использовании и предоставляет ряд параметров фильтрации.

Для вашего случая вы можете начать с чего-то вроде этого:

class RestaurantFilter(django_filters.FilterSet):
    #use appropriate field names below.
    outlet_type = django_filters.CharFilter(name="outlet_type", lookup_type="contains")
    cuisine_type = django_filters.CharFilter(name="cuisine_type", lookup_type="contains")

class Meta:
    model = Restaurant
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...