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”)不可为空,即使请求中不存在,也会导致验证错误。我想这与布尔场有关。也许你是对的。我得再看看这件事。一旦完成,我会更新你。我现在有一个类似的问题。你能帮我调查一下吗?