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