Django REST Framework:过帐数据时非空列上出现完整性错误

Django REST Framework:过帐数据时非空列上出现完整性错误,django,rest,serialization,django-rest-framework,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(

我有两个相关的模型:

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) 
哪些映射到这些Seralizer:

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处的整数错误/

列“required”中的null值违反了NOTNULL约束

详细信息:失败的行包含(62017-08-1412:01:52.857902+002017-08-1412:01:52.857984+00,dummyparam,dummy_参数,null,dummy,null,6)

基本上,它抱怨NOTNULL“required”属性(在参数模型中)丢失,从而导致DB错误

我的问题是,这不应该由序列化程序验证器来处理,而不是引发DB异常吗?事实上,我还有另外一组NOTNULL属性,当json数据中缺少时会触发验证错误。

您可以尝试添加is\u valid()

如果需要,您可以添加raise验证例外:

        serializer.is_valid(raise_exception=True)
        serializer.save()
您可以尝试添加is_valid()

如果需要,您可以添加raise验证例外:

        serializer.is_valid(raise_exception=True)
        serializer.save()

回答你的具体问题-

我的问题是,这不应该由序列化程序验证程序处理吗 而不是抛出DB异常?事实上,我还有一堆 在中丢失时触发验证错误的非空属性 json数据

只有当请求数据中存在该密钥时,才会执行序列化程序端的验证程序。由于您根本没有传递该属性“required”,因此在序列化程序端不会调用任何验证器

您还应该在额外的_kwargs的帮助下告诉序列化程序这些字段,如下所示-

 extra_kwargs = {
     'required': {'required': True},
 }

回答你的具体问题-

我的问题是,这不应该由序列化程序验证程序处理吗 而不是抛出DB异常?事实上,我还有一堆 在中丢失时触发验证错误的非空属性 json数据

只有当请求数据中存在该密钥时,才会执行序列化程序端的验证程序。由于您根本没有传递该属性“required”,因此在序列化程序端不会调用任何验证器

您还应该在额外的_kwargs的帮助下告诉序列化程序这些字段,如下所示-

 extra_kwargs = {
     'required': {'required': True},
 }

谢谢,我设法用额外的夸格解决了这个问题。尽管如此,还是有一些东西没有100%的意义。您说验证器“仅当请求数据中存在该密钥时”才运行,但这很奇怪,因为我说过其他字段(例如,“label”)不可为空,即使请求中不存在,也会导致验证错误。我想这与布尔场有关。也许你是对的。我得再看看这件事。一旦完成,我会更新你。我现在有一个类似的问题。你能帮我调查一下吗?谢谢,我设法用额外的_-kwargs解决了它。尽管如此,还是有一些东西没有100%的意义。您说验证器“仅当请求数据中存在该密钥时”才运行,但这很奇怪,因为我说过其他字段(例如,“label”)不可为空,即使请求中不存在,也会导致验证错误。我想这与布尔场有关。也许你是对的。我得再看看这件事。一旦完成,我会更新你。我现在有一个类似的问题。你能帮我调查一下吗?