python - 用于请求解析的 django 序列化程序中的类型不匹配
问题描述
我为 JSON 数据的请求解析创建了以下序列化程序。但是,在执行操作时,我收到了一个意外错误。
class A(serializers.ModelSerializer):
class Meta:
model = CName
fields = ('id','contact','email')
read_only_fields=('contact',)
class B(serializers.ModelSerializer):
class Meta:
model = PName
fields = ('id','contact','number')
read_only_fields=('contact',)
class C(serializers.ModelSerializer):
contact_number = A(many=True)
contact_email = B(many=True)
class Meta:
model = Contact
fields = ('id','name','contact_number','contact_email')
def create(self,validated_data):
contact_number=validated_data.pop('contact_number')
contact_email =validated_data.pop('contact_email')
instance = Contact.objects.create(**validated_data)
for number in contact_number:
PName.objects.create(contact=instance,**number)
for email in contact_email:
CName.objects.create(contact=instance,**email)
return instance
def update(self, instance, validated_data):
contact_number=validated_data.pop('contact_number')
contact_email =validated_data.pop('contact_name')
Contact.objects.filter(id=instance.id).update(**validated_data)
number_to_keep=[]
email_to_keep=[]
for number in contact_number:
if number.get('id'):
ph_id = number.pop('id')
PName.objects.filter(id=ph_id).update(**number)
number_to_keep.append(ph_id)
else:
ph=PName.objects.create(contact=instance,**number)
number_to_keep.append(ph.id)
for email in contact_email:
if email.get('id'):
em_id = email.pop('id')
CName.objects.filter(id=em_id).update(**email)
email_to_keep.append(em_id)
else:
em = CName.objects.create(contact=instance,**email)
email_to_keep.append(em.id)
instance.contact_number.exclude(id__in=number_to_keep).delete()
instance.contact_email.exclude(id__in=email_to_keep).delete()
return instance
我有一个 json 格式,我在其中以格式传递请求数据(我将只有字符串):
{
"contact_number": "9999999999",
"contact_email":"timsh@hotmail.com"
}
使用以下代码调用序列化程序时:
contact_details = Contact.objects.get(rest = rest)
contact_serializer = ContactSerializer(contact_details,data=request.data)
我收到如下回复:
{
"contact_number": {
"non_field_errors": [
"Expected a list of items but got type \"unicode\"."
]
},
"contact_email": {
"non_field_errors": [
"Expected a list of items but got type \"unicode\"."
]
}
}
注意:我不能使用以下格式的 JSON 数据格式:
{
"contact_number" : [
{ "number" : "9999999999"
}
],
"contact_email" : [
{ "email" : "tim@hotmail.com"
}
]
}
谁能建议可以在序列化程序中进行哪些更改,以便我可以解决这里的问题。
解决方案
class A(serializers.ModelSerializer):
class Meta:
model = CName
fields = ('id','contact','email')
read_only_fields=('contact',)
def save(self, **kwargs):
[obj.save(**kwargs) for obj in self]
保存时使用自定义保存方法。
推荐阅读
- c++ - C++中的动态时钟
- docker-for-windows - 配置 Akka.Net Remoting 以便(Windows)docker 容器内的进程可以与本地主机上的进程通信
- swift - 读取并打印从服务器接收到的编码消息,该消息存储在 UnsafeMutablePointer 类型的缓冲区中
- python - 从 ADLS2 转移到计算目标非常慢 Azure 机器学习
- android-fragments - MVVMCross : 创建一个 MvxFragment 使应用程序崩溃
- javascript - iframe 中的 Google 电子表格以 htmlview 模式打开,而不是在较小的屏幕中以编辑模式打开?
- mongodb - 使用多个集合的多个连接条件,使用管道 mongodb
- c++ - 用于调试/忽略函数的自定义编译时间说明符
- cpu - 通过标准应用 GUI 打开硬件监视器风扇控制
- swiftui - 如何将表单放入 SwiftUI 模态中?