设置和无效的字段设置为无在Django休息
问题描述:
我有models.py设置和无效的字段设置为无在Django休息
class Report(models.Model):
field_1 = models.Integerfield(blank=True, null=True, validators=[MaxValueValidator(10)])
field_2 = models.Integerfield(blank=True, null=True)
serializers.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.']}
即使field_1不是必需的(required = False)
我希望我的报告创建时field_2集合和field_1在None中,但无法找到正确实现此方法的方法。
什么是实现这一目标的好方法,即不会引发optionnal字段上的ValidationError。
答
我最好的办法就是修改field_1
的值,在你的序列化器的方法validate
中。您必须明确检查它是否等于0,如果是,请将其更改为None
。
def validate(self, data):
if data['field_1'] == 0:
data['field_1'] = None
return super().validate(data)
但是,请注意,更改validate
中的值不是一种好的做法。
另一种选择是从模型字段中删除MaxValueValidator
,并更改串行器的方法create
中的值。这将需要您验证,如果该值低于10并且不同于validate
中的0。换句话说,更多的代码。
最后但并非最不重要,您也可以在视图的post
方法中进行此更改,显然在序列化程序验证之前调用该方法。不是最好的做法,因为理想的是所有的输入数据都是在序列化器内部操作的,但代码量少。
def post(self, request, *args, **kwargs):
if request.data['field_1'] == 0:
request.data['field_1'] = None
super().post(request, *args, **kwargs)
+0
非常感谢。我实施了第三种解决方案;) –
data = {'field_2':50}会发生什么,我假设你得到的行为是因为如果你为field_1提供一个值,即使为0,也应该是有效的。 0 =/= null或无 –