如何动态添加自定义字段进行建模

时间:2009-03-28 08:22:33

标签: django django-models

如何动态添加自定义字段? 我正在尝试,但是当我同步db:

时,该字段不会插入数据库
#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)

2 个答案:

答案 0 :(得分:3)

如果不攻击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 :(得分:0)

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