zym*_*mud 9 python django django-rest-framework
问题:如何在表单和序列化器中编写用于字段验证的DRY代码?
示例:我有简单的django应用程序与模型形式,它验证passengers字段为Order:
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
Run Code Online (Sandbox Code Playgroud)
和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
Run Code Online (Sandbox Code Playgroud)
这不是干的,我写了两次相同的逻辑.我怎么能避免这个?也许我可以从表单或类似的东西继承序列化程序.
您可以使用序列化程序反序列化并验证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()
Run Code Online (Sandbox Code Playgroud)
小智 5
这是我对模型表单的可重用验证类的实现。除了重写的get_serializer方法之外,所有原生的 Django 东西都在这里。使用 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
Run Code Online (Sandbox Code Playgroud)
这是使用示例:
class ExperimentForm(RestFrameworkValidationModelForm):
serializer_class = ExperimentSerializer
class Meta:
model = Experiment
exclude = []
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3738 次 |
| 最近记录: |