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

Ano*_*wie 3 python forms django validation

我有一个Django应用,其模型可以通过Django REST Framework和常规表单界面访问。在将更改保存到模型之前,form接口进行了一些验证检查,但不使用任何特殊的Django框架,而只是视图中的简单本地更改。

我想将相同的验证应用于表单和REST调用,因此我想将验证移至模型中。我可以看到使用Field的验证器字段的简单情况下的处理方法,但是在一种情况下,我有一个名称/类型/值模型,其中“值”的可接受值根据选择的类型而变化。验证程序不会收到有关该字段所在模型的任何信息,因此它无权访问其他字段。

我如何执行此验证,而在DRF的序列化程序和表单的POST视图中没有实质相同的代码?

Sag*_*ari 6

如果您需要验证而{'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

Run Code Online (Sandbox Code Playgroud)

  • 这正是我所需要的。为什么其他人要尝试这种困难的方法?这必须被接受的答案。 (2认同)

wim*_*wim 5

当每个字段的验证如下定义时,不会发送有关其他字段的任何信息:

def validate_myfield(self, value):
    ...
Run Code Online (Sandbox Code Playgroud)

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

def validate(self, data):
    ...
Run Code Online (Sandbox Code Playgroud)

然后你在一个字典中得到所有的数据,你就可以做跨领域的验证了。

  • 这个答案是在 DRF“ModelSerializer”子类的上下文中。尽管 Django 模型中存在类似的情况,但对于“clean_myfield”和“clean”方法。您是否通过 DRF 发布...? (2认同)