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
.