Django REST框架:发布数据时非空列上的完整性错误

时间:2017-08-14 12:07:02

标签: django rest serialization django-rest-framework

我有这两个相关的模型:

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数据中丢失时会触发验证错误。

2 个答案:

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