将自定义字段添加到django模型(不更改源代码)

时间:2016-02-10 08:53:43

标签: python django database-schema

客户希望将自定义字段添加到我们提供的django模型中。

他希望自己做这件事,而无需编程。

这些东西应该是可以添加的:

  • 布尔(是/否)字段。可选“未设置”
  • 单选字段
  • 多选字段
  • 单行文字字段
  • textarea字段
  • 日期

示例:

  

客户希望添加一个他称之为“成功”的字段。并且该领域>应该有这些选择:是/否/未设置。默认不设置。

如果我可以通过创建或扩展模型来实现这一目标,那将会很容易。但在这种情况下,不允许更改源代码: - (

如何解决这个问题?

更新

需要支持查询具有给定值的实例。示例:显示“成功”为“真”的所有实例。

6 个答案:

答案 0 :(得分:7)

您可以创建一个遵循EAV principle(实体属性值)的表。基本上这是一个非规范化的表,其中包含以下列:
[ID(和/或slug),float_value,integer_value,string_value](向此表添加更多列)

现在说你有一个名为“会员”的现有桌子。当客户通过您的UI添加动态字段时,您可以在此处添加条目并使用“ID”查找给定成员。

答案 1 :(得分:2)

我使用Django Dynamic Forms。开箱即用,它允许用户通过管理员创建自己的表单。您可能希望扩展它以构建更加用户友好的UI,但这应该让您相当远。它支持

  • 布尔
  • 选择(选择)
  • 多项选择(多项选择)
  • 日期
  • 日期时间
  • 时间
  • 电子邮件
  • 整数
  • 单行文字
  • 多行文字

答案 2 :(得分:2)

好吧,当我遇到这样的问题时,我曾经创建了一个自定义字段模型,带有名称字段和类型字段,通常是一个选择字段,可以选择可能的字段类型。您还可以添加is_active字段以过滤活动和非活动CustomField。

然后,当我创建for时,我搜索这些对象以了解我必须在该表单中包含哪些字段。

要存储数据,我会有另一个名为CustomFieldAnswer的模型,或者像这样的一些思考。此模型应具有应具有此数据的主模型的ForeignKey和自定义字段。

这样做,你可以为你的模型提供任何类型的字段,并且客户需要编写任何代码。

您可以使用元编程基于CustomFields中的查询在表单中创建实际字段。或者,您可以将字段放在模板中并更改每个CustomField的输入类型。

希望有所帮助!

答案 3 :(得分:0)

如果这真的是你想要的。

  1. 创建客户所需的足够字段。

    boolean_field_1 = models.BooleanField(..)
    boolean_field_2 ..
    date_field_1 = ..
    date_field_2 = ..
    
  2. 在某处存储别名映射。

    我可以为别名映射添加一个字段。

    json_mapping_field = JSONField()
    # this has is_successful: boolean_field_1
    
  3. 然后找到可以将别名替换回真实字段名称的地方

    对于简单的过滤和更新,您可以覆盖

    1. QuerySet.filter Queryset.exclude
    2. QuerySet.update,UpdateQuery.add_update_values
    3. 最后使用from_queryset让你的经理使用覆盖的QuerySet。

答案 4 :(得分:0)

我知道这听起来像是一个糟糕的黑客,但也许你可以构建一个创建文本文件的界面?

  1. 一个文件是models.py,带有模型定义,并且使用JobTitles
  2. 从迁移中排除此模型
  3. 如果客户想要一个新表,或者只是ALTER表,则另一个文件是带有DROP和CREATE表的SQL。
  4. 另一个脚本可以运行SQL脚本,将models.py文件复制到正确的目录,然后重新加载django。

答案 5 :(得分:0)

我刚刚发现,djangopackages上甚至还有一个比较网格:

https://www.djangopackages.com/grids/g/dynamic-models/

航向:

  

用于在设置中或甚至在运行时向模型添加字段的应用程序。

某些StackOverflow管理员删除了这个答案,这就是我再次写它的原因。

删除原因是:

  

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面发生更改,仅链接答案可能会无效。

以下是今天在比较网格上列出的当前包: