我意识到验证器需要简单,但是,在这种情况下,我仍然宁愿使用它们,而不是使用“clean/保存函数”。
我有一个名为用户(又名雇员)的模型,它有一个joinDate和一个exitDate。exitDate可以为空,但是,当它们被填充时,它们需要在joinDate之后(显然)。
class user(models.Model):
joinDate = models.DateField()
exitDate = models.DateField(null=True, blank=True, default=None,
validators=[secondDateAfterFirstDateValidator(joinDate)])
验证器是一个返回函数的函数,就像这篇文章Is it possible to have validators with parameters?推荐的那样
def secondDateAfterFirstDateValidator(joinDate):
def innerfn(value):
if value < joinDate:
raise ValidationError("The exitDate must be after the joinDate")
return innerfn
我得到的错误是:“datetime.date”和“DateField”的示例之间不支持“〈”
现在,传递的值就是验证器传递的值,也就是验证器传递到的DateField的值(exitDate),它会自动从models.Datefield转换为'datetime.date',但是,当你传递joinDate给验证器时,它不会将其转换为'datetime.date'的示例,而是将其保留为models. Datefield。
我如何在不依赖clean/保存方法的情况下解决这个问题?我还有其他的模型,比如'Project',它有一个startDate和一个endDate,在这些模型中它也会面临类似的问题。我不想在clean/save方法中对每个需要第二个日期〉第一个日期的模型重复相同的验证。
1条答案
按热度按时间yjghlzjz1#
您尝试做的事情不能也不应该与验证器一起工作。您尝试跨多个字段进行验证,而这些验证不应该委托给字段本身,因为只有模型才具有完成验证所需的所有信息。
现在,为什么它不起作用。当你定义验证器
exitDate
时,你传递了joinDate
作为参数,它是models.CharField()
类型的,你没有传递一些类型的引用到将来的值,当验证发生时,这个值将是这个字段。所有这些都在python类示例化时得到了解决,在验证之前。您链接的帖子使用硬编码值作为验证器的参数,这些参数可以在验证器中定义,没有任何行为差异。验证器参数的唯一目的是分解一些代码,而不是多字段验证。
正如您已经知道的,您需要查看“清理/保存功能”