如何将模型移动/升级/更改为继承模型

时间:2014-07-11 10:44:44

标签: django

我们有一个模型:

class Person(models.Model):
  name = models.CharField(max_length=50)

和继承的模型:

class User(Person):
  email = models.EmailField();

让我们假设,首先我添加了一些人的实例,并且它与基础中的许多其他对象相关联。

然后人想成为一名用户。

当然我可以删除Person,并添加User,但是我几乎不可能重新创建Person的所有连接。

非django方式只是在数据库用户中添加一个字段,使用人员ID并添加电子邮件 - 它按预期工作,但它的可怕和非django方式。

那么如何正确地做到这一点?

1 个答案:

答案 0 :(得分:1)

这有点像黑客,但应该有效!

person = Person.objects.get(...)
person.__class__ = User
person.email = email
person.save()

您现在拥有一个User对象!

如果您愿意,可以将其放入装饰者:

def upgradable(model):
    @classmethod
    def upgrade(cls, base, **kwargs):
        base.__class__ = cls
        for attr, value in kwargs.items():
            setattr(base, attr, value)
        return base
    setattr(model, "upgrade", upgrade)
    return model

@upgradable
class User(Person):
    email = models.EmailField()

您可以这样使用:

person = Person.objects.get(...)
user = User.upgrade(person, email="example@example.com")
user.save()