Django Rest Framework недействительные данные сериализатора, не могу понять почему

Я создаю простую модель с полем "многие-ко-многим". Модель работает нормально, и я могу создать модель через админ панель, и я могу сделать get запрос, чтобы увидеть эту модель (за исключением того, что он возвращает только идентификаторы пользователей вместо моделей/объектов пользователей). Моя проблема заключается в том, что при создании post запроса для создания указанной модели.

Я получаю одну из двух ошибок в зависимости от вносимых изменений, The serializer field might be named incorrectly and not match any attribute or key on the 'str' instance. или AssertionError: You cannot call '.save()' on a serializer with invalid data., в любом случае это как-то связано с моим сериализатором. Ниже приведена моя модель,

class Schema(models.Model):
    week = models.PositiveIntegerField(primary_key=True, 
                                       unique=True,
                                       validators=[MinValueValidator(1), MaxValueValidator(53)],
                                       )
    users = models.ManyToManyField(MyUser, related_name="users")

    class Meta:
        ordering = ('week',)

Мое мнение,

class SchemaView(APIView):
    permission_classes = (SchemaPermissions,)

    def get(self, request):
        schemas = Schema.objects.all()
        serializer = SchemaSerializer(schemas, many=True)

        return Response(serializer.data)

    def post(self, request):
        data = request.data
        serializer = SchemaSerializer(data=data)
        serializer.is_valid()
        serializer.save()
        return Response(serializer.data, status=status.HTTP_200_OK)

И мой сериализатор,

class SchemaSerializer(serializers.ModelSerializer):
    class Meta:
        model = Schema
        fields = ('week', 'users')

    def create(self, validated_data):
        users_data = validated_data.pop('users')
        users = MyUser.objects.filter(id__in=users_data)
        schema = Schema.objects.create(week=validated_data.week, users=users)

        return schema

    def update(self, instance, validated_data):
        users_data = validated_data.pop('users')
        users = MyUser.objects.filter(id__in=users_data)
        instance.users.clear()
        instance.users.add(*users)
        instance.saver()
        return instance

Идея заключается в том, что если номер недели уже существует, то он должен вызвать функцию update() и затем просто перезаписать пользователей, связанных с этим номером недели, в противном случае он должен вызвать create() и создать новый номер недели с отношениями к заданным пользователям. Ниже приведен результат печати сериализатора после его инициализации в представлении.

SchemaSerializer(data={'week': 32, 'users': [1, 2, 3]}):
    week = IntegerField(max_value=53, min_value=1, validators=[<UniqueValidator(queryset=Schema.objects.all())>])
    users = PrimaryKeyRelatedField(allow_empty=False, many=True, queryset=MyUser.objects.all())

Мне кажется, что сериализатор должен быть валидным для данной модели? Возможно, мне не хватает некоторых концепций и знаний о Django и DRF, так что любая помощь будет очень признательна!

Сначала вам нужно установить поле для сохранения users в SchemaSerializer. И вам не нужно настраивать метод create и update, потому что логика может быть закодирована в views.

class SchemaSerializer(serializers.ModelSerializer):
    users = UserSerializer(read_only = True, many = True)
    user_ids = serializers.ListField(
        child = serializers.IntegerField,
        write_only = True
    )

    class Meta:
        model = Schema
        fields = ('week', 'users', 'user_ids',)

    # remove create and update method

И в файле views.py,

class SchemaView(APIView):
    permission_classes = (SchemaPermissions,)

    def get(self, request):
        ...

    def post(self, request):
        data = request.data
        serializer = SchemaSerializer(data=data)
        if serializer.is_valid():
            input_data = serializer.validated_data
            week = input_data.get('week')
            user_ids = input_data.get('user_ids')
            if Schema.objects.filter(week = week).count() > 0:
                schema = Schema.objects.get(week = week).first()
            else:
                schema = Schema.objects.create(week = week)
            schema.users.set(user_ids)
            schema.save()
        
            return Response(SchemaSerializer(schema).data, status=status.HTTP_200_OK)
        else:
            return Response(status = status.HTTP_400_BAD_REQUEST)

И, конечно, данные полезной нагрузки должны быть

{'week': 23, 'user_ids': [1,2,3]}
Вернуться на верх