2016-11-30 39 views
1

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

+1

data = {'field_2':50}会发生什么,我假设你得到的行为是因为如果你为field_1提供一个值,即使为0,也应该是有效的。 0 =/= null或无 –

回答

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) 
+0

非常感谢。我实施了第三种解决方案;) –

相关问题