【问题标题】:Django end-user defined fields, how to? [duplicate]Django最终用户定义的字段,如何? [复制]
【发布时间】:2012-02-21 12:55:45
【问题描述】:

可能重复:
Django dynamic model fields

早安各位! 场景如下。对于 Django 上的某些模型,我想允许最终用户定义自己的字段。如果我能保留像 ORM 这样的所有 Django 很棒的特性,那就太好了,所以我仍然可以调用 field__gte 来搜索模型,仍然可以根据字段类型进行字段验证等。我考虑过两种方法这个,我非常愿意接受新的建议。任何反馈将不胜感激。

  1. 第一种方法是实体属性值(http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model),django 已经有一个应用程序。见http://code.google.com/p/django-custom-field/ 我认为这将是一个不错的解决方案,但我失去了执行“mymodel.objects.filter(custom_field_x=something)”的能力。也许有办法重新获得 ORM,有什么想法吗?但是我听说过很多关于这种方法的坏故事,以至于我有点害怕使用它。

  2. 第二种方法是为每个用户创建一个数据库表(可能不超过 1000 个)。我读过 django 在 inspectdb 的行中有一些东西,它实际上检查了哪些字段在那里并为您生成模型。这可能很有用,但我想也许我应该存储这个特定用户创建的字段,并以某种方式告诉 django,嘿,我们在这个模型中也有这个字段。这可能吗?我知道为每个用户设置不同的表通常不好,但是考虑到这种情况,你们如何评价这种方法,是否可以为每个用户设置一个表?

需要自定义字段的模型例如 Person。他们可能想要一个自定义字段来存储地址、血型或任何其他内容。

提前非常感谢!祝你星期天愉快!

非常相似:How to create user defined fields in Django -- 但只谈论 EAV,我想避免。我愿意接受新的想法!

【问题讨论】:

标签: django django-models custom-fields


【解决方案1】:

一种方法是使用基于 NoSQL 文档的解决方案,例如 MongoDB,它允许您存储具有流动结构的对象(没有预定义列等限制)。

优点:

  1. 对自定义字段类型、字段类型数量等没有限制。
  2. 保留 ORM 功能 (django-mongodb)
  3. NoSQL 的其他各种优势 - 您可以在线阅读相关信息
  4. 避免 EAV

缺点:

  1. 需要设置 NoSQL 服务器
  2. NoSQL 概念(文档与表格)所需的其他知识
  3. 您可能需要维护两个数据库 - 如果您决定不将整个解决方案迁移到 NoSQL (multi-db)

编辑:

阅读 cmets 后,值得指出的是,根据您使用的 NoSQL 解决方案,您可能不需要恢复支持。例如,CouchDB 内置了对 document versioning 的支持。

【讨论】:

  • 您好,burhan,感谢您的回答! mongodb 看起来很棒。可悲的是我的共享主机不支持它。我现在正在寻找一个新的虚拟主机(但这是另一回事)。无论如何,我想问的是:你知道使用 mongodb 是否会破坏任何其他应用程序?例如,如果我使用 django-revisions (djangopackages.com/packages/p/django-revisions),它还能工作吗?非常感谢!
  • @Clash,是的,使用 mongodb 会破坏不希望使用 NoSQL 数据库的外部 django-apps。所以 django-revisions 不起作用。但是,您可以设置多个数据库,因为 Django 现在支持它。唯一的问题是无法跨这些数据库加入。
  • @Spike,我明白了。我猜我不能在使用自定义字段的模型上使用修订版?非常感谢您的回复!
  • @Clash,正确。不幸的是,如果不对其进行大量更改,您可能无法使用它。如果您想将 django-revisions 和其他 django 应用程序与您正在谈论的这个应用程序结合使用,最简单的解决方案是坚持使用关系数据库。
  • @Spike,我只想再说一遍,非常感谢您的建议。对此深表赞赏。我想我现在要留在关系领域。但是学习一点关于 NoSQL 的知识非常好。我期待与它合作,看起来非常灵活和直接。
【解决方案2】:

创建另一个模型来存储 user_defined_fields 怎么样?

    class UserDefinedField(models.Model):
        #..................
        user = models.ForeignKey(User)
        field_name = models.CharField(max_length=50)
        field_value = models.TextField()

那你就可以UserDefinedField.objects.filter(field_name=some_name,field_value=somevalue)

【讨论】:

  • 我猜这只是 EAV 的一个小变种
猜你喜欢
  • 1970-01-01
  • 2010-11-30
  • 2014-03-01
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 2012-10-22
相关资源
最近更新 更多