2016-11-30 5 views
1

を休ま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で作成され、field_1はNoneで作成されますが、これを正しく行う方法が見つかりません。

これを達成するには、つまり、optionnalフィールドでValidationErrorを引き上げないとよいでしょう。

+1

data = {'field_2':50}の場合は、0が有効であってもfield_1の値を提供している場合に発生する動作が想定されます。 0 =/= nullまたはなし –

答えて

1

私のベストショットは、シリアライザのvalidateメソッド内でfield_1の値を変更することです。 0に等しいかどうかを明示的にチェックしなければならない場合は、Noneに変更してください。

def validate(self, data): 
    if data['field_1'] == 0: 
     data['field_1'] = None 
    return super().validate(data) 

ただし、validateの値を変更することは適切ではありません。

もう1つの方法は、モデルフィールドからMaxValueValidatorを削除し、シリアライザのcreateメソッド内の値を変更することです。これは、値が10より小さく、0と異なる場合にはvalidateの範囲内で検証する必要があります。つまり、より多くのコード。

最後に、ビューのpostメソッド内でこの変更を行うことができます。これは、シリアライザの検証前に明示的に呼び出されます。すべての入力データがシリアライザ内で操作されるのが理想的ですが、コードは少ないのでベストプラクティスではありません。

def post(self, request, *args, **kwargs): 
    if request.data['field_1'] == 0: 
     request.data['field_1'] = None 
    super().post(request, *args, **kwargs) 
+0

ありがとうございます。私は3番目のソリューションを実装しました;) –

関連する問題