Django не может обновить поле с помощью serialzier

Здравствуйте, у меня сериализатор выглядит так

class PredefinedHabitSerializer(serializers.ModelSerializer):

    image= serializers.SerializerMethodField()

    class Meta:
        model = models.PredefinedHabit
        fields = [
            "id",
            "habit",
            "category",
            "why",
            "how",
            "dos",
            "donts",
            "info",
            "alternative",
            "image"
        ]

    def get_image(self, obj):
        if  obj.image.startswith("https"):
            return obj.image
        else:
            return aws_get(obj,"s3-debug")

Метод сериализатора get_image используется для получения URL ключа изображения, хранящегося в поле модели image

И представление для редактирования этой модели

def edit_predefined_habit(request):
        predefined_habit = PredefinedHabit.objects.get(id=request.data.get("id"))
        data = {
            "category": request.data.get("category"),
            "habit": request.data.get("habit"),
            "why": request.data.get("why"),
            "how": request.data.get("how"),
            "dos": request.data.get("dos"),
            "donts": request.data.get("donts"),
            "info": request.data.get("info"),
            "alternative": request.data.get("alternative"),
            "image": request.data.get("illustration"),
        }
        data = Functions.clean(data)
        serializer = PredefinedHabitSerializer(predefined_habit, data=data)
        if serializer.is_valid():
            serializer.save()
            return Response(data={"status": "success"})

Вид для получения всех объектов

def viewPredefinedHabits(request):
        model = PredefinedHabit.objects.all()
        serializer = PredefinedHabitSerializer(model, many=True)
        return Response(serializer.data)

Я не могу обновить поле image с помощью edit API, насколько я понимаю, это происходит потому, что я указал image как поле метода сериализатора. Как мне это преодолеть? Я пробовал write_only не работает

Другой способ, который я могу придумать, это вручную сохранить в объект и .save без передачи в сериализатор.

Вы можете создавать сериализаторы для каждого типа запроса.

class PredefinedHabitReadSerializer(serializers.ModelSerializer):

    image= serializers.SerializerMethodField()

    class Meta:
        model = models.PredefinedHabit
        fields = [
            "id",
            "habit",
            "category",
            "why",
            "how",
            "dos",
            "donts",
            "info",
            "alternative",
            "image"
        ]

    def get_image(self, obj):
        if  obj.image.startswith("https"):
            return obj.image
        else:
            return aws_get(obj,"s3-debug")

class PredefinedHabitUpdateSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.PredefinedHabit
        fields = [
            "habit",
            "category",
            "why",
            "how",
            "dos",
            "donts",
            "info",
            "alternative",
            "image"
        ]
    def to_representation(self, instance):
        return PredefinedHabitReadSerializer(instance).data

После вы можете использовать PredefinedHabitUpdateSerializer, когда вам нужно обновить экземпляр модели. Если вам нужно получить или перечислить ваш запрос, вы можете использовать PredefinedHabitReadSerializer.

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