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')]}
Вот распечатка контракта, который я создал вручную в веб-браузере, и полезная нагрузка, переданная ему, была такой же, как и в модульном тесте:
После некоторого исследования исходного кода я заметил, что мои 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' }