我有一个Django应用程序,其模型可以通过Django REST Framework和常规表单界面访问。表单界面在保存对模型的更改之前进行了一些验证检查,但没有使用任何特殊的Django框架,只是视图中的一个简单的局部更改。
我想对表单和REST调用应用相同的验证,因此我想将验证移到模型中。我可以看到如何使用Field的validators字段为简单的情况做到这一点,但在一种情况下,我有一个名称/类型/值模型,其中可接受的值为' value'根据选择的类型进行更改。验证者没有收到有关该字段所在模型的任何信息,因此它无法访问其他字段。
如何在DRF的序列化程序和表单的POST视图中基本使用相同的代码来执行此验证?
答案 0 :(得分:3)
如果您需要验证并抛出序列化错误为
您可以采用{'my_field':'error message}
代替{'non_field_error':'error message'}
。
def validate_myfield(self, value):
data = self.get_initial() # data for all the fields
#do your validation
答案 1 :(得分:2)
如果定义如下,则每个字段的验证不会发送有关其他字段的任何信息:
def validate_myfield(self, value):
...
但是,如果你有一个像这样定义的方法:
def validate(self, data):
...
然后你获得了一个dict中的所有数据,你可以进行跨领域验证。
答案 2 :(得分:2)
您可以使用required包进行跨字段验证。它允许您在python中以声明方式表达验证规则。你可以在DRF中使用这样的东西:
class MySerializer(serializers.Serializer):
REQUIREMENTS = (
Requires("end_date", "start_date") +
Requires("end_date", R("end_date") > R("start_date")) +
Requires("end_date", R("end_date") < today.date() + one_year) +
Requires("start_date", R("start_date") < today.date() + one_year)
)
start_date = serializers.DateField(required=False, null=True, blank=True)
end_date = serializers.DateField(required=False, null=True, blank=True)
def validate(self, data):
self.REQUIREMENTS.validate(data) # handle validation error
您可以将REQUIREMENTS
放在模型上,让DRF和Django表单使用它验证您的数据。
Here是一篇博文,解释了更多