【发布时间】:2018-05-03 10:37:08
【问题描述】:
我得到一个包含来自多个对象的数据的 JSON 响应,通过序列化程序运行所有内容并调用 serializer.save(),它会创建新对象但不会更新现有对象。
查看
data = JSONParser().parse(request)
serializer = CellCESaveSerializer(data=data, many = True, context = {'descriptoridlist' : descriptoridlist}, partial=True)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, safe=False)
序列化器
class StringArrayField(ListField):
"""
String representation of an array field.
"""
def to_representation(self, obj):
obj = super().to_representation(obj)
# convert list to string
return ",".join([str(element) for element in obj])
def to_internal_value(self, data):
data = data.rstrip(",") # Needed because of JSON response
data = data.split(",") # Split string to list
data = [int(i) for i in data] # convert str to int
did = self.context['descriptoridlist']
x = (did,data) # Create Array
return super().to_internal_value(x)
class CellCESaveSerializer(serializers.ModelSerializer):
row = serializers.SlugRelatedField(slug_field="name",queryset=Descriptor.objects.all() ) # foreignkey mit namen
val = StringArrayField()
class Meta:
model = CellCE
fields = ('row','val')
如何在不创建新对象的情况下更新现有对象?
编辑 1:
添加@neverwalkaloner 更改后,我意识到我需要使用 ListSerializer 来更新多个对象。我在DRF documentation 的帮助下调整了我的代码。 (我把序列化器改成了 ListSerializer,添加了 id 字段和更新方法。)
序列化器:
class CellCESaveSerializer(serializers.ListSerializer):
row = serializers.SlugRelatedField(slug_field="name",queryset=Descriptor.objects.all()) # foreignkey mit namen
val = StringArrayField()
id = serializers.IntegerField()
class Meta:
model = CellCE
fields = ('row','val')
def update(self, instance, validated_data):
CellCE_mapping = {CellCE.id: CellCE for CellCE in instance}
data_mapping = {item['id']: item for item in validated_data}
# Perform creations and updates.
ret = []
for CellCE_id, data in data_mapping.items():
CellCE = CellCE_mapping.get(CellCE_id, None)
if CellCE is None:
ret.append(self.child.create(data))
else:
ret.append(self.child.update(CellCE, data))
# Perform deletions.
for CellCE_id, CellCE in CellCE_mapping.items():
if CellCE_id not in data_mapping:
CellCE.delete()
return ret
我得到错误:
AssertionError: `child` is a required argument.
我错过了什么?
【问题讨论】:
标签: django serialization django-rest-framework