gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:59:13 26 4
gpt4 key购买 nike

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

AttributeError: 'Contact' object has no attribute 'numbers'

这是完全有效的,但序列化程序确实具有该字段,并且应该能够保留这些值,以便我可以在保存联系人后保存它们。

如果我在 update 方法中做一些完全像这样的事情:
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 字段并且来自数据库,第三个是新的,我正在尝试添加它。

这是代码。当然,这并不是一种奇怪的做事方式。我应该使用 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

如何反序列化这些数据以便我可以保存它?

最佳答案

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

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

关于django - 你如何使 Django Rest Framework 序列化器双向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21070824/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com