Параметр запроса не соответствует ни одной записи, возвращается "Выберите правильный выбор. Этот выбор не является одним из доступных вариантов." вместо пустого массива

Я использую 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
Вернуться на верх