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

时间:2016-11-30 15:10:13

标签: django validation django-rest-framework

我有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。

1 个答案:

答案 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)