Django 如何向模型中动态添加自定义字段

Django 如何向模型中动态添加自定义字段,django,django-models,Django,Django Models,如何动态添加自定义字段? 我正在尝试,但在同步数据库时,该字段不会插入数据库: #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__) re

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

#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的内部,您可能无法做到这一点。
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的未来版本不兼容


剩下的问题是:你为什么要这么做?由于数据库表通常在部署应用程序时只创建一次,所以模型有点“静态”。

我也在寻找同样的东西,不得不接受原始SQL。尽管您可以使用SQLAlchemy.

+1之类的东西来引用django元类。您可以编写自己的模型元类,作为django模型元类的子类,以完成此任务。。。事实上,这是解决过去缺乏模型继承的方法。现在我们有了真正的模型继承,这可能是更好的方法。您可能会对本指南感兴趣: