Django最终用户定义的字段,如何?

时间:2012-01-29 08:22:12

标签: django django-models custom-fields

  

可能重复:
  Django dynamic model fields

早安伙计们! 场景如下。对于Django上的一些模型,我想允许最终用户定义自己的字段。如果我可以保留所有Django这些令人敬畏的功能,如ORM,那将是很棒的,所以我仍然可以执行类似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,嘿,我们在这个模型中也有这个字段。这可能吗?我知道为每个用户设置不同的表通常很糟糕,但考虑到这种情况,你们如何评价这种方法,是否可以为每个用户设置一个表?

  3. 需要自定义字段的模型例如是Person。他们可能想要一个自定义字段来存储地址,血型或任何其他东西。

    非常感谢!周日愉快!

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

2 个答案:

答案 0 :(得分:1)

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

优点:

  1. 对自定义字段类型,字段类型数等没有限制
  2. 保留ORM功能(django-mongodb
  3. NoSQL的其他各种好处 - 您可以在线阅读
  4. 避免使用EAV
  5. 缺点:

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

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

答案 1 :(得分:1)

如何创建另一个用于存储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)