Параметр запроса не соответствует ни одной записи, возвращается "Выберите правильный выбор. Этот выбор не является одним из доступных вариантов." вместо пустого массива
Я использую DjangoFilterBackend
для обработки параметров запроса на ModelViewSet
. Я ожидал, что если ничто в таблице не соответствует одному из параметров запроса, то она просто вернет пустой массив.
Вместо этого он возвращает:
{
"document_guid": [
"Select a valid choice. That choice is not one of the available choices."
]
}
Мне кажется это странным ответом, поэтому я задаюсь вопросом: как я могу изменить это поведение?
Лучше просто иметь следующее, указывающее на то, что ничего не совпало:
[]
Я знаю об этом похожем вопросе, но я уже делаю то, что они предложили:
https://stackoverflow.com/a/62219220/3123109
Вот URI, в котором нет записей, соответствующих document_guid
(но есть некоторые, соответствующие user_guid
):
localhost/api/d2u/?user_guid=55d57235-79b0-ec11-9840-000d3a5a343c&document_guid=df4c9c11-49dd-ec11-a7b6-000d3a3667a1
Вот соответствующий код:
# views.py
class Document2UserSyncViewSet(viewsets.ModelViewSet):
filter_backends = [DjangoFilterBackend]
filter_fields = [
'id',
'document_guid',
'user_guid'
]
permission_classes = [PowerAutomatePermissions]
queryset = Document2User.objects.all().order_by('id')
serializer_class = Document2UserSerializer
# serializer.py
class Document2UserSerializer(serializers.ModelSerializer):
"""Serializer for the d2u model.
Returns all fields.
"""
class Meta:
model = Document2User
fields = '__all__'
# models.py
class Document2User(models.Model):
document_guid = models.ForeignKey(
Documents,
to_field='guid',
on_delete=models.CASCADE,
db_column='document_guid'
)
user_guid = models.ForeignKey(
CRMFields,
to_field='guid',
on_delete=models.CASCADE,
db_column='user_guid'
)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
class Meta:
db_table = 'document_to_user'
unique_together = [['user_guid', 'document_guid']]
Я поговорил с разработчиком, который предложил сделать следующее, что сработало для меня. Это вернет пустой массив, когда нет совпадений, вместо этого сообщения.
# utils/filters.py
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import serializers
class StrictDjangoFilterBackend(DjangoFilterBackend):
"""Return no results if the query doesn't validate.
"""
def filter_queryset(self, request, queryset, view):
try:
return super().filter_queryset(request, queryset, view)
except serializers.ValidationError:
return queryset.none()
# documents/views.py
from utils.filters import StrictDjangoFilterBackend
class Document2UserSyncViewSet(viewsets.ModelViewSet):
filter_backends = [StrictDjangoFilterBackend]
filter_fields = [
'id',
'document_guid',
'user_guid'
]
permission_classes = [PowerAutomatePermissions]
queryset = Document2User.objects.all().order_by('id')
serializer_class = Document2UserSerializer