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

时间:2014-01-12 03:05:10

标签: django django-rest-framework

我有一个角度应用,它会显示一个包含联系人数据和联系号码列表的表单。每个联系人都可以有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

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

1 个答案:

答案 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