你如何使Django Rest Framework序列化器双向化

boa*_*der 6 django django-rest-framework

我有一个角度应用程序,它提供了一个包含联系人数据和联系号码列表的表单.每个联系人都可以有N个号码,每个号码都有一个类型(单元格,主页,工作......)下面的代码将json发送到角度应用程序就好了,我可以在那里处理它,包括添加新数字,删除数字.....但是当DRF获得完全相同的格式json时,它无法反序列化它.它抛出了这个错误:

AttributeError: 'Contact' object has no attribute 'numbers'
Run Code Online (Sandbox Code Playgroud)

这是完全有效的,但序列化程序有这个字段,应该能够挂起这些值,以便我保存联系后保存它们.

如果我在更新方法中做了类似这样的事情:

self.object = self.get_object_or_none()
self.object.numbers = []
Run Code Online (Sandbox Code Playgroud)

我可以消除该错误,但它会抛弃这些错误:

{'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.']}
]}
Run Code Online (Sandbox Code Playgroud)

前两个电话号码不是新的,它们有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
Run Code Online (Sandbox Code Playgroud)

如何反序列化此数据以便保存?

Vla*_*lad 6

我有同样的问题,并通过向序列化程序添加一些标志来解决它.在你的情况下,它应该是这样的:

number_type = PhoneTypeSerializer(source='number_type',  many=True, required=False, allow_add_remove=True, read_only=False)
Run Code Online (Sandbox Code Playgroud)

有点晚了,但也许它仍然有帮助.在此处找到此建议: 使用序列化程序作为字段时无法更新m2m