如何动态添加自定义字段? 我正在尝试,但是当我同步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)
答案 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的东西。