我有一个模型:
class MyModel(models.Model):
user = models.ForeignKey(User)
week = models.DateField()
我的应用程序是围绕"星期六结束的周"构建的,因此我希望week
字段仅接受星期六的日期。
我希望这种验证发生在Model
而不是Form
中,因为在某些情况下,我将在没有Form
的情况下进行数据输入。
我知道覆盖模型的save()
方法来添加full_clean()
可能是要走的路,但我对这里的最佳实践感到困惑。
最干燥的方法是什么?
我会提供一个验证器,特别是如果您在没有表单的情况下输入数据时需要一个干净的数据库。
如果输入是datetime.date
,则可以使用mydate.weekday()
来获取其星期几。星期六应该是"5"。
像这样:
def validate_saturday(value):
if not value.week.weekday == 5:
raise ValidationError("Date should be a Saturday.")
另一种方法是在模型中指定周数,而不是日期字段。
您可以在字段上指定验证器
week = models.DateField(validators=[validate_sat])
def validate_sat(value):
if value is not a saturday:
raise ValidationError('%s isn't a saturday' % value)
我省略了实际的逻辑来确定日期是一周中的哪一天,但这应该不会太难
请注意,保存模型时不会自动运行验证程序,但如果使用的是 ModelForm,它将在表单中包含的任何字段上运行验证程序
现在,由于您说您可能不会在所有保存实例中使用表单,您可能希望使用将进行验证的pre_save
信号,如果它不是有效值,您可以随时在此引发验证错误。
如果可能的话,可能值得尝试合并模型更新方法以从窗体进行更新。