问题:如何在表单和序列化器中编写用于字段验证的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)
这不是干的,我写了两次相同的逻辑.我怎么能避免这个?也许我可以从表单或类似的东西继承序列化程序.
我有mixin和型号:
class Mixin(object):
field = GenericRelation('ModelWithGR')
class MyModel(Mixin, models.Model):
...
Run Code Online (Sandbox Code Playgroud)
但是django不会把GenericRelation场变成GenericRelatedObjectManager:
>>> m = MyModel()
>>> m.field
<django.contrib.contenttypes.fields.GenericRelation>
Run Code Online (Sandbox Code Playgroud)
当我将字段放入模型本身或抽象模型时 - 它工作正常:
class MyModel(Mixin, models.Model):
field = GenericRelation('ModelWithGR')
>>> m = MyModel()
>>> m.field
<django.contrib.contenttypes.fields.GenericRelatedObjectManager at 0x3bf47d0>
Run Code Online (Sandbox Code Playgroud)
我怎样才能GenericRelation在mixin中使用?