Django Rest Framework выдает ошибку валидации, которая не должна возникать при использовании модульных тестов

Я создаю этот API и в определенной точке моих тестов (конечная точка создания контракта) я получаю недопустимую ошибку.

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

Я помещаю здесь много кодов просто в целях репликации, но код, который действительно важен для просмотра, это ContractSerializer и test_contract_creation функция

Вот мой код:

models.py

view.py

from django.forms.models import model_to_dict
from django.db.utils import IntegrityError

from rest_framework import viewsets
from rest_framework.reverse import reverse
from rest_framework.exceptions import ValidationError

from space_travel import serializers
from core import models


class ResourceViewSet(viewsets.ModelViewSet):
    queryset = models.Resource.objects.all()
    serializer_class = serializers.ResourceSerializer


class ShipViewSet(viewsets.ModelViewSet):
    queryset = models.Ship.objects.all()
    serializer_class = serializers.ShipSerializer


class PlanetViewSet(viewsets.ModelViewSet):
    queryset = models.Planet.objects.all()
    serializer_class = serializers.PlanetSerializer


class PilotViewSet(viewsets.ModelViewSet):
    queryset = models.Pilot.objects.all()
    serializer_class = serializers.PilotSerializer


class RouteViewSet(viewsets.ModelViewSet):
    queryset = models.Route.objects.all()

    def get_serializer_class(self):
        if self.action in ["retrieve", "list"]:
            # This serializer will show a hyperlinked
            # representation for origin/destination fields
            return serializers.RouteReadSerializer

        # This serializer will use th planet names for writing
        # instead of hyperlinked representations
        return serializers.RouteWriteSerializer


class ContractViewSet(viewsets.ModelViewSet):
    queryset = models.Contract.objects.all()
    serializer_class = serializers.ContractSerializer

serializers.py

test_contract_endpoint.py

Теперь вот ошибка валидации, которую я получаю: {'cargo_set': [ErrorDetail(string='This field is required.', code='required')]}

Вот распечатка контракта, который я создал вручную в веб-браузере, и полезная нагрузка, переданная ему, была такой же, как и в модульном тесте: image

После некоторого исследования исходного кода я заметил, что мои cargo_set устанавливаются как ListSerializer, и проблема возникает, когда field.get_value() вызывается внутри .to_internal_data(). Я не знаю, почему, но regex внутри parse_html_list() не срабатывает. Это единственное, что я заметил, что может быть проблемой

Буду рад любой помощи. Спасибо!

Похоже, это та же проблема, что и у меня Вложенная десериализация не работает с сообщением "This field is required"

Убедитесь, что используете APITest, который отправляет запрос в кодировке JSON.

Чтобы исправить это, я изменил свой тестовый пример, чтобы использовать APIClient, предоставленный DRF:

from rest_framework.test import APIClient

client = APIClient()

В моем settings.py я добавил следующее в конфигурацию:

REST_FRAMEWORK = { ... 'TEST_REQUEST_DEFAULT_FORMAT': 'json' }

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