【问题标题】:How dynamic add custom field to model如何动态添加自定义字段到模型
【发布时间】:2010-10-16 02:24:17
【问题描述】:

如何动态添加自定义字段? 我正在尝试,但是当我同步数据库时该字段不会插入数据库:

#It use as register(MyModel)
def register(model, attr="my_attr"):

    if model in registry:
        raise AlreadyRegistered(
            _('The model %s has already been registered.') % model.__name__)

    registry.append(model)
    setattr(model, attr, MyField())

    MyField().contribute_to_class(model, attr) 

#MyField.contribute_to_class
def contribute_to_class(self, cls, name):
     super(MyField, self).contribute_to_class(cls, name)

     setattr(cls, self.name, self)
     cls.add_to_class('%s_manager' %  name, MyDescriptor())

     signals.post_save.connect(self._save, cls, True)

【问题讨论】:

标签: django django-models


【解决方案1】:

如果不侵入 Django 的内部,你可能无法做到这一点。 syncdb 命令检查每个模型的元对象以获取要创建的字段列表,该列表是在类构建时通过 django.db.models.Model 基类的元类创建的:

class MyModel(models.Model):
    my_filed = models.CharField(...)

# Here, class construction is complete and your class has a _meta member.
# If you want, you can check it out in the interactive shell.
meta = MyModel._meta

类构建完成后,例如在class 语句之后的 DEDENT 之后,元对象是固定的(不受修改模型类的影响),您必须破解元对象(这当然是可能的)才能添加动态字段。但是由于你在这里搞乱了内部对象,它可能会使你的应用程序与 Django 的未来版本不兼容。

剩下的问题是:您为什么要这样做?由于数据库表通常只在部署应用时创建一次,因此模型是一种“静态”的。

【讨论】:

  • +1 用于引用 django 元类。可以编写自己的模型元类,作为 django 模型元类的子类,来做到这一点……事实上,这是解决过去缺乏模型继承的方法。现在我们有了真正的模型继承,这可能是更好的方法。
【解决方案2】:

我一直在寻找同样的东西,不得不接受原始 SQL。虽然你可以使用 SQLAlchemy 之类的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2014-04-02
    • 2012-07-11
    • 1970-01-01
    相关资源
    最近更新 更多