根据另一个字段的值验证Django模型字段?

时间:2016-10-18 17:50:24

标签: python django forms validation

我有一个Django应用程序,其模型可以通过Django REST Framework和常规表单界面访问。表单界面在保存对模型的更改之前进行了一些验证检查,但没有使用任何特殊的Django框架,只是视图中的一个简单的局部更改。

我想对表单和REST调用应用相同的验证,因此我想将验证移到模型中。我可以看到如何使用Field的validators字段为简单的情况做到这一点,但在一种情况下,我有一个名称/类型/值模型,其中可接受的值为' value'根据选择的类型进行更改。验证者没有收到有关该字段所在模型的任何信息,因此它无法访问其他字段。

如何在DRF的序列化程序和表单的POST视图中基本使用相同的代码来执行此验证?

3 个答案:

答案 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是一篇博文,解释了更多