Проблемы с фильтрацией фреймворка REST Django? - PullRequest
0 голосов
/ 25 мая 2018

У меня есть эта проблема при использовании Django Rest Framework.Я пытаюсь сделать запрос на получение, используя идентификатор пациента.Теперь, допустим, я ищу длявадайв = 6, API-интерфейс возвращает результаты с помощью патиентид = 6, патиентид = 26 и любых идентификаторов, которые содержат число «6».Похоже, что он ищет подстроку. Я хочу, чтобы она работала так, чтобы идентификатор пациента = 6 возвращал только результаты пациента с идентификатором = 6

serializers.py

class Radiologypdfserializerdata(serializers.ModelSerializer):

    class Meta:
        model = models.Radiologypdf
        fields = (
            'patientid',
            'testinfo',
            'clinicalindication',
            'attendingdoctor',
            'patientname',
            'age',
            'mobilenumber',
            'sex',
            'email',
            'doctorsname',
            'doctorsregistrationnumber',
            'clinicname',
            'doctorstelno',
            'createdtime',
            'radiology_id',
            'created',

        )

api.py

class RadiologypdfViewSet(viewsets.ModelViewSet):
    """ViewSet for the radiology class"""

    queryset = models.Radiologypdf.objects.all()
    serializer_class = serializers.Radiologypdfserializerdata
    permission_classes = [permissions.IsAuthenticated]

    filter_backends = (filters.SearchFilter,)
    search_fields = ('patientid','radiology_id')

Ответы [ 3 ]

0 голосов
/ 26 мая 2018

Выдержка из документов: http://www.django -rest-framework.org / api-guide / filtering / # searchfilter

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

  • '^' Начинается с поиска.
  • '=' Точные совпадения.
  • '@' Полнотекстовый поиск.(В настоящее время поддерживается только серверная часть MySQL от Django.)
  • '$' Поиск по регулярному выражению.

Например, измените свой код следующим образом:

`search_fields = ('=patientid','radiology_id')`
0 голосов
/ 19 марта 2019

Поскольку вы уже используете SearchFilter, вы можете просто добавить "=" к полям фильтра.В этом случае ваши поля фильтра будут:

filter_fields = ('=patientid','=radiology_id')

Согласно документации:

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

  • '^' Начинается с поиска.
  • '=' Точные совпадения.
  • '@' Полнотекстовый поиск.(В настоящее время поддерживается только серверная часть MySQL от Django.)
  • '$' Поиск по регулярному выражению.
0 голосов
/ 25 мая 2018

Для этого вы можете использовать библиотеку django-filter.

Просто установите ее с помощью:

pip install django-filter

И используйте в вашем видеонаборе вот так:

from django_filters.rest_framework import DjangoFilterBackend

class RadiologypdfViewSet(viewsets.ModelViewSet):
    """ViewSet for the radiology class"""

    queryset = models.Radiologypdf.objects.all()
    serializer_class = serializers.Radiologypdfserializerdata
    permission_classes = [permissions.IsAuthenticated]

    filter_backends = (DjangoFilterBackend,)
    filter_fields = ('patientid','radiology_id')
...