一尘不染

Django模型继承:创建现有实例的子实例(向下转换)?

django

我正在尝试集成一个第三方Django应用程序,该应用程序做出了不幸的决定继承自django.contrib.auth.models.User,这对于可插拔应用程序来说是一个很大的禁忌。引用马尔科姆·特雷丁尼克(Malcolm Tredinnick):

不过,更重要的是,就像在Python中一样,你不能使用Django的模型继承来“贬低”。就是说,如果你已经创建了User实例,那么你必须在不掩饰的情况下使该实例与你尚未创建的子类实例相对应。

好吧,我处于需要将此第三方应用程序与现有用户实例集成的情况。因此,如果假设我确实愿意在幕后p脚,那我有什么选择?我知道这行不通:

extended_user = ExtendedUser(user_ptr_id=auth_user.pk)
extended_user.save()

也不例外,但是它会破坏各种东西,首先是django.contrib.auth.models.User用空字符串覆盖所有列…


阅读 324

收藏
2020-03-29

共1个答案

一尘不染

这应该工作:

extended_user = ExtendedUser(user_ptr_id=auth_user.pk)
extended_user.__dict__.update(auth_user.__dict__)
extended_user.save()

在这里,你基本上只是将auth_user版本中的值复制到extended_user版本中,然后重新保存。不是很优雅,但是可以。

2020-03-29