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模型元类的子类,以完成此任务。。。事实上,这是解决过去缺乏模型继承的方法。现在我们有了真正的模型继承,这可能是更好的方法。您可能会对本指南感兴趣: