Django Rest FrameworkシリアライザとDjango Forms.
-
21-12-2019 - |
質問
質問:両方の形式とシリアライザの両方でフィールド検証のためのドライコードを書き込む方法?
例:
passengers
のOrder
フィールドを検証するモデルフォームを含む単純なDjangoアプリがあります。
def clean_passengers(self):
passengers = self.cleaned_data['passengers']
if passengers > self.flight.available_seats:
raise forms.ValidationError(
_(u'''Passengers count can`t be greater then seats count'''))
return passengers
.
Order
シリアライザでの検証のための同じコード:
def validate_passengers(self, attrs, source):
passengers = attrs[source]
if passengers > self.flight.available_seats:
raise serializers.ValidationError(
_(u'''Passengers count can`t be greater then seats count'''))
return attrs
.
これは乾燥していて、私は同じ論理を2回書き込んでいます。私はこれを避けることができますか?多分私はフォームまたはこのようなものからシリアライザを継承することができます。
解決
シリアライザを使用して、フォームのis_valid
メソッド内のデータを逆シリアル化して検証できます。
class MyModelForm(ModelForm):
def is_valid(self):
# Call super's is_valid to populate cleaned_data and do basic field validation
valid = super(MyModelForm, self).is_valid()
if not valid:
return False
serializer = MyModelSerializer(data=self.cleaned_data)
return serializer.is_valid()
. 他のヒント
モデルフォームのための再利用可能な検証クラスの実装。すべてのネイティブのDjangoのことはここにいます。get_serializer
メソッドを書き換えました。Django 1.8.13で検証済みの作業状態。
class RestFrameworkValidationModelForm(forms.ModelForm):
serializer_class = None
def get_serializer(self, *args, **kwargs):
"""
Return the serializer instance that should be used for validating and
deserializing input, and for serializing output.
"""
assert self.serializer_class is not None, (
"'%s' should either include a `serializer_class` attribute, "
"or override the `get_serializer()` method."
% self.__class__.__name__
)
return self.serializer_class(*args, **kwargs)
def is_valid(self):
if super(RestFrameworkValidationModelForm, self).is_valid():
serializer = self.get_serializer(data=self.cleaned_data)
valid = serializer.is_valid()
self.add_error(None, serializer.errors)
return valid
return False
.
そしてここに使用例:
class ExperimentForm(RestFrameworkValidationModelForm):
serializer_class = ExperimentSerializer
class Meta:
model = Experiment
exclude = []
. I would suggest putting all validation (when possible) into the model (validators or clean
).
ModelForm
and ModelSerializer
then use the mode-validation.
所属していません StackOverflow