我有这两个相关的模型:
class EndPoint(TimeStampedModel):
name = models.CharField(max_length=100)
url = models.CharField(max_length=100)
description = models.CharField(max_length=100)
class Parameter(TimeStampedModel):
name = models.CharField(max_length=100)
label = models.CharField(max_length=100)
required = models.BooleanField()
type = models.CharField(max_length=100)
format = models.CharField(max_length=100, null = True)
endpoint = models.ForeignKey(EndPoint, related_name="parameters",null = True, on_delete=models.CASCADE)
这些版本的地图:
class ParameterRelationSerializer(serializers.ModelSerializer):
class Meta:
model = Parameter
fields = ('id', 'name', 'label', 'required','type','format')
class EndPointSerializer(serializers.ModelSerializer):
parameters = ParameterRelationSerializer(many = True, read_only=False)
class Meta:
model = EndPoint
fields = ('id', 'name', 'url', 'description', 'parameters')
def create(self, validated_data):
parameters = validated_data.pop('parameters')
endPoint = EndPoint.objects.create(**validated_data)
for parameter_relation in parameters:
Parameter.objects.create(endpoint=endPoint, **parameter_relation)
return endPoint
现在,当我尝试使用此数据发布新端点时:
{
"url":"http://the.url.com",
"name":"Dummy url",
"description":"This is a dummy url",
"parameters":[
{
"name":"dummyparam",
"type":"dummy",
"label":"dummy_parameter"
}
]
}
我收到500错误说:
/ catalogs / endpoints /
中的IntegrityError“必需”列中的空值违反了非空约束
详细信息:失败行包含(6,2017-08-14 12:01:52.857902 + 00,2017-08-14 12:01:52.857984 + 00,dummyparam,dummy_parameter,null,dummy,null,6)。
基本上,它抱怨缺少'null'必需'属性(在参数模型中),从而导致数据库错误。
我的问题是,这不应该由串行器验证器处理而不是抛出数据库异常吗?事实上,我有另一堆非空属性在json数据中丢失时会触发验证错误。
答案 0 :(得分:1)
你可以尝试添加is_valid()
ParameterRelationSerializer
for parameter_relation in parameters:
parameter_relation.update({"endpoint":endPoint})
serializer = ParameterRelationSerializer(data=parameter_relation)
if serializer.is_valid():
serializer.save()
如果您需要它,您可以添加提升验证功能:
serializer.is_valid(raise_exception=True)
serializer.save()
答案 1 :(得分:1)
回答您的具体问题 -
我的问题是,不应该由序列化验证器处理 而不是抛出数据库异常?事实上,我有另一堆 缺少时触发验证错误的非null属性 json数据。
只有在请求数据中存在该密钥时,才会执行序列化程序结束时的验证器。因为你没有传递那个属性" required"因此,在序列化器端没有调用验证器。
您还应该在extra_kwargs的帮助下告诉序列化器这些字段,如下所示 -
Grid