Я хочу получить список запросов с одним ключом больше значений. Например,
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
Это стоило мне одного дня, чтобы решить эту проблему, не могли бы вы сказать мне как это исправить, или другой способ это реализовать?