在多个对象序列化程序的情况下进行验证



我的数据输入以'n'个dicts 的列表形式

"contact_person":[
{
"contactperson_salutation[0]":"sddd",
"contactperson_first_name[0]":"santoorr",
"contactperson_last_name[0]":"",
"contactperson_email[0]":"gfgh",
"contactperson_mobile_number[0]":"",
"contactperson_work_phone_number[0]":"jio"
},
{
"contactperson_salutation[1]":"dfsf",
"contactperson_first_name[1]":"lux",
"contactperson_last_name[1]":"",
"contactperson_email[1]":"",
"contactperson_mobile_number[1]":"",
"contactperson_work_phone_number[1]":"9048"
}, .............]

我的模型是这样的:

class ContactPerson(models.Model):
client = models.ForeignKey(Client, on_delete=models.CASCADE)
contactperson_salutation = models.CharField(max_length=4, choices=SALUTATIONS)
contactperson_first_name = models.CharField(max_length=128)
contactperson_last_name = models.CharField(max_length=128, blank=True)
contactperson_email = models.EmailField(blank=True, null=True)
contactperson_mobile_number = models.CharField(max_length=20, blank=True)
contactperson_work_phone_number = models.CharField(max_length=20, blank=True)

如何在输入列表中每个dict的字段名称都发生变化时编写序列化程序。。

如果出现错误,错误响应应采用以下格式:

[
{
"contactperson_email[0]":"Invalid Email",
"contactperson_mobile_number[0]":"Invalid mobile phone",
"contactperson_work_phone_number[0]":"Invalid workphone number"
},
{
"contactperson_mobile_number[1]":"Invalid mobile phone",
"contactperson_work_phone_number[1]":"Invalid workphone number"
}
]

您可能会受益于解析类似"contactperson_salutation[0]"的字符串来构建一个具有所有ocurrence的listcontactperson_salutation

其他字段也是如此。

尝试覆盖Serializer的to_internal_value方法来实现这一点

但是错误仍然不是您需要的格式。错误消息将包含您的型号密钥,而不是后缀为[x]的密钥。

class ContactPersonSerializer(serializers.ModelSerializer):
class Meta:
model = ContactPerson
fields = [
"contactperson_salutation",
"contactperson_first_name",
"contactperson_last_name",
"contactperson_email",
"contactperson_mobile_number",
"contactperson_work_phone_number",
]
def to_internal_value(self, data):
if hasattr(data, "_mutable"):
data._mutable = True
data = {key[:-3]: value for key, value in data.items()}
if hasattr(data, "_mutable"):
data._mutable = False
return super().to_internal_value(data)

最新更新