我们有一个模型:
class Person(models.Model):
name = models.CharField(max_length=50)
和继承的模型:
class User(Person):
email = models.EmailField();
让我们假设,首先我添加了一些人的实例,并且它与基础中的许多其他对象相关联。
然后人想成为一名用户。
当然我可以删除Person,并添加User,但是我几乎不可能重新创建Person的所有连接。
非django方式只是在数据库用户中添加一个字段,使用人员ID并添加电子邮件 - 它按预期工作,但它的可怕和非django方式。
那么如何正确地做到这一点?
答案 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()