Вложенный сериализатор не работает так, как ожидалось в 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

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