在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非常感谢。我实施了第三种解决方案;)