2016-10-18 69 views
3

我有一个Django应用程序,可以通过Django REST框架和常规窗体界面访问模型。表单接口在保存对模型的更改之前有一些验证检查,但不使用任何特殊的Django框架,只是视图中的简单本地更改。基于另一个字段的值验证Django模型字段?

我想对表单和REST调用应用相同的验证,所以我想将验证移入模型中。我可以看到如何为使用Field的验证器字段的简单案例做到这一点,但在一种情况下,我有一个名称/类型/值模型,其中'值'的可接受值根据所选类型而变化。验证器不会发送有关该字段所在模型的任何信息,因此它无法访问其他字段。

如何在DRF的序列化程序和表单的POST视图中没有基本相同的代码的情况下执行此验证?

回答

1

每场不会发送关于其他领域的任何信息,当它这样定义的验证:

def validate_myfield(self, value): 
    ... 

但是,如果你有这样的定义的方法:

def validate(self, data): 
    ... 

然后你得到一个字典中的所有数据,并且你可以做交叉字段验证。

+0

关于哪个对象?我在模型基类中没有看到类似的东西... – AnotherHowie

+0

这个答案在DRF'ModelSerializer'子类的上下文中。尽管在Django模型中存在类似的情况,但对于'clean_myfield'和'clean'方法。你是通过DRF发布还是不是......? – wim

+0

是和不是。我有一个DRF API,但也有一个表单发布到的视图。 – AnotherHowie

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是博客文章解释更多

相关问题