我有models.py
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(必需= False)
我希望使用field_2 set和field_1创建我的报告,但无法找到实现此目的的方法。
实现这一目标的好方法是什么,即不在optionnal字段上引发ValidationError。
答案 0 :(得分:1)
我最好的方法是在序列化程序的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)