在Django中验证具有不完整数据的模型

时间:2015-07-30 16:06:51

标签: django database-design django-models

我正在处理的项目中有以下用例。

工作流程如下所示:

  • 系统接受提议的候选人(在此阶段,大多数字段不是必需的,电子邮件地址可能无效等)。
  • 他们的信息可以更正和更新
  • 部分候选人已注册(现在需要姓名和姓氏等字段,电子邮件必须有效等)

我提出了两个想法。

一个是候选人有两个模特。然后我可以利用Models和ModelForms中的自动验证,但是它需要将实例从一个模型复制到另一个模型,同时注册候选项并在不同的地方带来问题(例如使用ForeignKeys)。

第二个想法是让一个接受不完整数据的模型和两个ModelForms,一个带有重新定义的字段。

这两种想法都需要重复相似的代码。

有没有人知道DRY和Django风格的方法来解决这个问题?

2 个答案:

答案 0 :(得分:0)

如果您想要将中间阶段保存在数据库中并允许用户在另一次访问时编辑它,则听起来您需要建议的候选信息的模型和最终注册候选人的另一个模型。针对不同问题的单独模型。重申你的第一个选择:)

编辑此内容,因为我意识到这一切只是重复你的问题。在这种情况下,我坚持使用选项1,在必要时创建一个包含最终候选信息的新实例。对于最初的情况,我可能会使用外键将最终候选项链接到建议的候选实例,并在字段定义中使用null=True。这将允许定期运行清理任务并移除建议的候选实例,其中数据被复制用于已注册的候选者。或者,您可以咬住子弹并在成功保存最终实例后删除建议的实例。谨慎行事;你可能不需要考虑删除陈旧数据,除非它成为一个问题,所以我离题了。

这里有一些轻微的代码重复,但不是很多,如果你想减少毛茸茸的应用程序逻辑意外的可能性,有时它是不可避免的。

答案 1 :(得分:0)

您可以定义没有任何数据库限制的模型,然后实现两个不同的(模型)表单。

表单A用于输入新对象。因此,表单A不应包含特定的验证逻辑。

另一方面,表单B可以保存所有验证逻辑,并可用于维护数据完整性。

请注意,此方法不保证数据库的完整性。您的验证逻辑应该暴露在繁重的单元测试中。