2016-11-30 61 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

非常感謝。我實施了第三種解決方案;) –

相關問題