Вложенный сериализатор не работает так, как ожидалось в pytest
У меня есть класс сериализатора.
class CourseListSerializer(serializers.Serializer):
course_slug = serializers.CharField()
duration = serializers.FloatField()
class CourseAssignSerializer(serializers.Serializer):
first_name = serializers.CharField(max_length=255)
last_name = serializers.CharField(max_length=255)
email = serializers.EmailField(max_length=255)
username = serializers.CharField(max_length=255)
courses = CourseListSerializer(many=True)
class CourseAssignListSerializer(serializers.Serializer):
users = CourseAssignSerializer(many=True)
Это действие набора видов
class UserViewSet(RetrieveModelMixin, ListModelMixin, UpdateModelMixin, GenericViewSet):
serializer_class = UserSerializer
queryset = User.objects.all()
lookup_field = "id"
authentication_classes = (
ARestAuthentication,
BRestAuthentication,
)
permission_classes = (permissions.IsAuthenticated | HasAPIKeyWithPermission,)
resource_label = "users.User"
@action(
methods=["put"],
detail=False,
serializer_class=CourseAssignListSerializer,
url_path="assign-course",
)
def assign_course(self, request: Request):
serializer = self.get_serializer_class()(
data=request.data, context={"request": request}
)
serializer.is_valid(raise_exception=True)
serializer.update(None, serializer.validated_data)
return Response(status=status.HTTP_200_OK, data=serializer.data)
Вышеуказанные сериализаторы и viewset работают нормально, когда я обращаюсь к конечной точке с помощью postman. Но когда я хочу поместить его в тест, он выдает ошибку валидации. Я использую те же данные, когда тестирую их на postman и pytest
Это моя тестовая функция
def test_UserViewSet_assign_course(user):
request = APIRequestFactory().put(
"/api/users/assign-course/",
data={
"users":[
{
"first_name": "John",
"last_name": "doe",
"email": "jd@example.com",
"username": "jd",
"courses": [
{
"course_slug": "course_slug",
"duration": 30
}
]
}
]
}
force_authenticate(request=request, user=user)
action = UserViewSet.as_view(
actions={"put": "assign_course"}, serializer_class=CourseAssignListSerializer
)
response: Response = action(request=request)
print(response.data)
assert response.status_code == 200
Он дает мне
{'users': [ErrorDetail(string='This field is required.', code='required')]}
Но когда я использую пустые данные, например:
data={users:[]}
ошибка валидации не отображается, что означает, что она действительна.
Я предполагаю, что неправильно инициализирую сериализатор в своем тесте. Но я не знаю, как это сделать. Мне нужна помощь, чтобы мой pytest для этой конечной точки имел такое же поведение, как когда я обращаюсь к конечной точке из postman