我有一个角度应用,它会显示一个包含联系人数据和联系号码列表的表单。每个联系人都可以有N个号码,每个号码都有一个类型(单元格,主页,工作......)下面的代码将json发送到角度应用程序就好了,我可以在那里处理它,包括添加新数字,删除数字.....但是当DRF获得完全相同的格式json时,它无法反序列化它。它抛弃了这个错误:
AttributeError: 'Contact' object has no attribute 'numbers'
这是完全有效的,但是序列化程序具有该字段并且应该能够挂起这些值,以便在保存联系人后保存它们。
如果我在更新方法中做了类似这样的事情:
self.object = self.get_object_or_none()
self.object.numbers = []
我可以消除这个错误,但它会抛弃这些错误:
{'numbers': [
{u'non_field_errors': [u'Cannot create a new item, only existing items may be updated.']},
{u'non_field_errors': [u'Cannot create a new item, only existing items may be updated.']},
{u'non_field_errors': [u'Cannot create a new item, only existing items may be updated.']}
]}
前两个电话号码不是新的,它们有id字段,来自db,第三个是新的,我正在尝试添加它。
这是代码。当然,这不是一种奇怪的做事方式。 Django Rest Framework是我应该使用的吗?我一直在试着像这样的表演停止者,这似乎是记录下来的做事方式,但随后它们爆发了。
class PhoneTypeSerializer(serializers.ModelSerializer):
class Meta:
model = PhoneType
class ContactPhoneSerializer(serializers.ModelSerializer):
number_type = PhoneTypeSerializer(source='number_type')
class Meta:
model = ContactPhone
depth = 1
exclude = ('owner',)
class ContactSerializer(serializers.ModelSerializer):
numbers = ContactPhoneSerializer(source='number_set', many=True, required=False)
class Meta:
model = Contact
如何反序列化此数据以便保存?
答案 0 :(得分:6)
我有同样的问题并通过向序列化程序添加一些标志来解决它。在你的情况下,它应该是这样的:
number_type = PhoneTypeSerializer(source='number_type', many=True, required=False, allow_add_remove=True, read_only=False)
有点晚了,但也许它仍然有帮助。在这里找到这个建议: Updating m2m not possible when using serializers as fields