Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在django rest中将无效字段设置为“无”_Django_Validation_Django Rest Framework - Fatal编程技术网

在django rest中将无效字段设置为“无”

在django rest中将无效字段设置为“无”,django,validation,django-rest-framework,Django,Validation,Django Rest Framework,我有模特 class Report(models.Model): field_1 = models.Integerfield(blank=True, null=True, validators=[MaxValueValidator(10)]) field_2 = models.Integerfield(blank=True, null=True) 序列化程序.py class ReportSerializer(serializers.ModelSerializer):

我有模特

class Report(models.Model):

    field_1 = models.Integerfield(blank=True, null=True, validators=[MaxValueValidator(10)])
    field_2 = models.Integerfield(blank=True, null=True)
序列化程序.py

class ReportSerializer(serializers.ModelSerializer):

    class Meta:
       fields = (field_1, field_2)
当我尝试

r = ReportSerializer(data={'field_1':0, 'field_2': 50}
r.is_valid(True)
它提出:

{'field_1': ['Ensure this value is greater than or equal to 10.']}
即使字段_1不是必需的(必需=False)

我希望创建报告时设置字段_2,字段_1为None,但无法找到正确实现此目的的方法


实现这一点的好方法是什么,即不在可选字段上引发ValidationError。

我最好的办法是在序列化程序的
验证
方法中修改
字段的值。您必须明确检查它是否等于0,如果等于0,则将其更改为
None

def validate(self, data):
    if data['field_1'] == 0:
        data['field_1'] = None
    return super().validate(data)
但是,请注意,更改
validate
中的值不是一个好做法

另一个选项是从模型字段中删除
MaxValueValidator
,并更改序列化程序的
create
方法中的值。如果值小于10且与0不同,则需要在
validate
中进行验证。换句话说,更多的代码

最后但并非最不重要的一点是,您还可以在视图的
post
方法中进行此更改,该方法显然是在序列化程序验证之前调用的。这也不是最佳实践,因为理想情况是所有输入数据都在序列化程序中进行操作,但代码更少

def post(self, request, *args, **kwargs):
    if request.data['field_1'] == 0:
        request.data['field_1'] = None
    super().post(request, *args, **kwargs)

对于data={'field_2':50},我假设您得到的行为是因为如果您为field_1提供一个值,即使是0,也应该是有效的。0=/=null或none非常感谢。我实施了第三种解决方案;)