【问题标题】:Validation of model with incomplete data in Django在 Django 中验证具有不完整数据的模型
【发布时间】:2015-07-30 16:06:51
【问题描述】:

我正在从事的项目中有以下用例。

工作流程如下所示:

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

我想出了两个想法。

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

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

这两个想法都需要复制非常相似的代码。

有谁知道处理这个问题的 DRY 和 Django 风格的方法?

【问题讨论】:

  • 请发一个例子

标签: django database-design django-models


【解决方案1】:

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

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

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

请注意,这种方法不能保证数据库的完整性。您的验证逻辑应该接受繁重的单元测试。

【讨论】:

  • 数据库完整性比 DRY 更重要
  • 这与我认为的第二个选项相对应。由于数据完整性问题,我会避免这种方法。您不希望出现单个模型的实例可以同时代表提议和注册候选人的情况。你可以有一个is_registered 标志,但是它只会在以后引起一些应用程序逻辑混乱。使用针对最终候选人的单独模型,您可以确保数据对这些实例有效。
  • 是的,这基本上是第二种选择,但我想明确指出,没有必要对字段进行“重新定义”。相反,所有都可以在clean-methods(字段和表单)中处理。是的,我自己不会牺牲数据库完整性,但定义两个几乎相同的模型似乎也是错误的。
  • 重新定义字段以覆盖默认参数是 Django 文档鼓励的方法。在我作为初级开发人员的日子里,我可能考虑过基于元类或自定义 __init__ 方法的方法(不记得两者是否都可以工作,或者只有第一个)来遍历可选字段列表并覆盖它们的属性苍蝇。但是,这将成为可识别性的障碍,我现在不会碰它——除非可选字段的数量非常多。
【解决方案2】:

如果您想将中间阶段保存在数据库中并允许用户在另一次访问时对其进行编辑,那么您似乎需要一个模型用于建议的候选人信息,而另一个模型用于最终注册的候选人。针对不同关注点的不同模型。重申您的第一个选择:)

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

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

【讨论】:

    猜你喜欢
    • 2011-04-11
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多