#django-rest-framework #django-serializer
Вопрос:
Я новичок в платформе Django rest и пытаюсь обновить существующие данные в базе данных. Но вместо обновления в базу данных добавляются новые данные.
serializers.py
class CustomersSerializer(serializers.Serializer):
lname = serializers.CharField(max_length=10)
fname = serializers.CharField(max_length=10)
def create(self, validated_data):
return Customers.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.fname = validated_data.get('fname', instance.fname)
instance.lname = validated_data.get('lname', instance.lname)
instance.save()
return instance
view.py
def UpdateData(request): # Not Working
user = Customers.objects.get(id=1)
serialize = CustomersSerializer(user)
json_data = JSONRenderer().render(serialize.data)
stream = io.BytesIO(json_data)
data = JSONParser().parse(stream)
serializer = CustomersSerializer(data=data)
if serializer.is_valid():
temp_dict = serializer.validated_data
temp_dict['fname'] = "abcd"
serializer.save()
return HttpResponse("Updated..")
Если весь мой процесс неправильный, кто-нибудь, пожалуйста, предложите мне несколько хороших ресурсов для понимания сериализаторов и фреймворка django rest.
Я узнал, что вызов .save() либо создаст новый экземпляр, либо обновит существующий экземпляр, в зависимости от того, был ли передан существующий экземпляр при создании экземпляра класса сериализатора.
Ответ №1:
def UpdateData(request): # Not Working
##payload send in request(fields with value which are changed) in request.data
request_data = request.data
payload = {
'fname' : 'test',
'lname' : 'user'
}
user = Customers.objects.get(id=1)
serialize = CustomersSerializer(user,payload,partial=True)
##specify renderers/decoders settings in settings.py/config.py
if serializer.is_valid():
##don't know why you need this.
temp_dict = serializer.validated_data
temp_dict['fname'] = "abcd"
###
serializer.save()
return HttpResponse("Updated..")
return HttpResponse('error in update {}'.format(serializer.errors))
См.Изменение в сериализаторе, сначала извлеките объект, подлежащий обновлению, который является пользователем, за которым следует словарь, содержащий поля и значение для обновления, и partial=True, указывающее частичное обновление.
Для сохранения нового объекта непосредственно передайте полезную нагрузку в сериализатор, за которым следует .save()
serializer = CustomersSerializer(data=payload)
if serializer.is_valid():
serializer.save()
Для ВВОДА в эксплуатацию отправьте полные обновленные данные Заказчика
customer = Customer.objects.get(id=1)
serializer = CustomersSerializer(customer,data=payload)
if serializer.is_valid():
serializer.save()
Комментарии:
1. это работает, но за исключением того, что ему нужно изменить Response() на HttpResponse (), в остальном это показывает мне
Exception Value: .accepted_renderer not set on Response