Django queryset возвращает элементы, которые он не должен возвращать

Я использую queryset, которому помогает сериализатор в Django RestApi, чтобы вернуть список имен, которые находятся в определенных полях определенных таблиц.

"DataSourceIdUnique" - это модель, общая для всех остальных через внешний ключ и используется для построения набора запросов.

Вот представление API:

class ProfileAPI(generics.ListAPIView):

    filter_backends = (DynamicSearchFilter,)

    def get_queryset(self):

        queryset = DataSourceIdUnique.objects.all().prefetch_related(
            "address", "data", "name", "list", "iddata"
        )
        name_type = self.request.query_params.getlist("nametype", [])
        country_type = self.request.query_params.getlist("countrytype", [])
        id_type = self.request.query_params.getlist("idtype", [])
        policy_code = self.request.query_params.getlist("policy_code", [])
        user = self.request.user

        group_id = self.request.user.groups.all()
        if name_type != []:
            queryset = queryset.filter(name__name_type__in=name_type)
            print(name_type)

        if country_type != []:
            queryset = queryset.filter(address__address_type__in=country_type)
        if id_type != []:
            queryset = queryset.filter(iddata__doc_id_type__in=id_type)

        if policy_code != []:
            group_id = user.groups.all().values_list("id", flat=True)

            queryset = queryset.filter(data__policy_code__policy_name__in=policy_code)

            queryset = queryset.filter(
                data__policy_code__associated_user_groups__in=group_id
            )

        return queryset

    serializer_class = DataSerializer

и вот сериализатор, который используется:

class DataSerializer(serializers.ModelSerializer):
    class Meta:
        model = DataSourceIdUnique
        depth = 2
        fields = [
            "data_source_id",
            "data",
            "address",
            "iddata",
            "list",
            "name",
       ]

Когда я проверяю представления с помощью оболочки python manage.py и выполняю:

>>> from data_viewer.serializers import DataSerializer
>>> serializer = DataSerializer()
>>> print(repr(serializer))

все проверено. Все необходимые поля доступны и могут быть отфильтрованы.

Сейчас возникает проблема, когда я делаю вызов API и результаты возвращаются, они также включают элементы, которые не существуют в базе данных.

В качестве примера, запуск API с поисковым запросом "kevin" возвращает результаты для профилей, которые содержат "kevin", НО в другом поле, чем было найдено. Таким образом, Кевин не существует как часть профиля с "Типом имени" "Основное имя", но существует там, где тип имени "Также известен как". Это сбивает с толку, поскольку я считаю, что набор запросов правильный и должен просматривать только результаты, которые появляются в "Primary Name"

Параметры запроса следующие:

<QueryDict: {'page': ['1'], 'page_size': ['10'], 'search': ['kevin'], 'search_fields': ['name__firstname', 'name__middlename', 'name__lastname', 'name__maidenname'], 'nametype': ['Primary Name']}>

а SQL, полученный с помощью print(str.queryset.query)), дает следующее:

<QueryDict: {'page': ['1'], 'page_size': ['10'], 'search': ['kevin'], 'search_fields': ['name__firstname', 'name__middlename', 'name__lastname', 'name__maidenname'], 'nametype': ['Primary Name']}>

Что я здесь упускаю?

Django 4.0.2, Python 3.9.5, mysqlclient 2.1.0, djangorestframework 3.13.1

Вернуться на верх