Django Бэкэнд фильтра REST Framework с несколькими значениями? - PullRequest
0 голосов
/ 12 января 2020

Я хочу получить список запросов с одним ключом больше значений. Например,

http://127.0.0.1:8000/management/device/model/list/?device_type=1&hardware_model_mother=master&hardware_model_mother=MasterModel1&hardware_model_child=SlaveModel1

Тогда я могу получить список запросов device_type=1,hardware_model_child=SlaveModel1,hardware_model_mother=master и device_type=1,hardware_model_child=SlaveModel1,hardware_model_mother=MasterModel1. Мне нужен список полей, поэтому я не использовал функцию in_bulk().

Я нашел несколько фильтров в django -filter's do c, вот ссылка: https://django-filter.readthedocs.io/en/latest/ref/filters.html

Я выбираю MultipleChoiceFilter, он будет использовать ИЛИ, это то, что я хотел.

Вот код моего фильтра:

from django_filters import FilterSet, MultipleChoiceFilter
from Device_set.views.DeviceModelFilter import DeviceModelFilter
from .head import *


# one key for multiple values
class DeviceModelFilter(FilterSet):
    MOTHER_CHOICES, CHILD_CHOICES = DeviceModelFilter().MyChoices()
    hardware_model_mother = MultipleChoiceFilter(choices=MOTHER_CHOICES)
    hardware_model_child = MultipleChoiceFilter(choices=CHILD_CHOICES)

    class Meta:
        model = device_model
        fields = ['hardware_model_mother', 'hardware_model_child']

и мой список APIView:

class DeviceModelListView(ListAPIView):
    permission_classes = [Developer | IOTWatch | IsAdminUser]
    serializer_class = DeviceModelListSerializer
    queryset = device_model.objects.all()
    filter_backends = (SearchFilter, DjangoFilterBackend,)
    filter_class = DeviceModelFilter
    search_fields = ('id', 'name')
    filterset_fields = ('hardware_model_mother', 'hardware_model_child')

    def list(self, request, *args, **kwargs):
        dtype = self.request.query_params.get('device_type')
        if dtype is not None:
            queryset = self.queryset.filter(device_type__icontains=dtype)
        else:
            queryset = self.queryset
        queryset = self.filter_queryset(queryset)
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

    def get(self, request, *args, **kwargs):
        return Response(Return_msg(self.list(request)))

когда url равен http://127.0.0.1:8000/management/device/model/list/?device_type=1&hardware_model_mother=master&hardware_model_mother=MasterModel1

Результат правильный: правильный ответ

Однако, когда url равен http://127.0.0.1:8000/management/device/model/list/?device_type=1&hardware_model_child=SlaveModel1

Это неправильно: false

Traceback: Traceback

Это стоило мне одного дня, чтобы решить эту проблему, не могли бы вы сказать мне как это исправить, или другой способ это реализовать?

...