代码之家  ›  专栏  ›  技术社区  ›  Kilian Perdomo Curbelo

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

  •  0
  • Kilian Perdomo Curbelo  · 技术社区  · 8 年前

    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的错误:

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

    详细信息:失败行包含(6,2017-08-14 12:01:52.857902+00,2017-08-14 12:01:52.857984+00,dummyparam,dummy_参数,null,dummy,null,6)。

    基本上,它抱怨(在参数模型中)缺少非空的“required”属性,从而导致DB错误。

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   Ankur Sharma    8 年前

    回答您的具体问题-

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

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

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

     extra_kwargs = {
         'required': {'required': True},
     }
    
        2
  •  1
  •   Brown Bear    8 年前

    您可以尝试添加is\u 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()