首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django模型继承:创建现有实例的子实例(向下转换)?

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

Stack Overflow用户
提问于 2010-11-01 03:46:19
回答 7查看 11.5K关注 0票数 52

我正在尝试集成一个第三方Django应用程序,它做出了继承django.contrib.auth.models.User的不幸决定,这是可插拔应用程序的一大禁忌。引用Malcolm Tredinnick

然而,更重要的是,就像在

中一样,你不能用Django的模型继承来“向下转换”。也就是说,如果您已经创建了User实例,那么如果不在幕后探索,就无法使该实例与您尚未创建的子类实例相对应。

好吧,我现在的情况是我需要将这个第三方应用程序与我现有的用户实例集成。所以,如果假设我真的愿意在被子下摸索,我有什么选择?我知道这不管用:

代码语言:javascript
复制
extended_user = ExtendedUser(user_ptr_id=auth_user.pk)
extended_user.save()

也没有例外,但它打破了所有的东西,首先是用空字符串覆盖django.contrib.auth.models.User中的所有列……

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-11-01 05:19:33

这应该是可行的:

代码语言:javascript
复制
extended_user = ExtendedUser(user_ptr_id=auth_user.pk)
extended_user.__dict__.update(auth_user.__dict__)
extended_user.save()

在这里,您基本上只是将值从auth_user版本复制到extended_user版本中,然后重新保存它。不是很优雅,但很管用。

票数 74
EN

Stack Overflow用户

发布于 2015-05-18 14:14:14

我通过询问django用户邮件列表找到了这个答案:

https://groups.google.com/d/msg/django-users/02t83cuEbeg/JnPkriW-omQJ

这不是公共API的一部分,但您可以依赖于Django如何在内部加载fixture。

代码语言:javascript
复制
parent = Restaurant.objects.get(name__iexact="Bob's Place").parent
bar = Bar(parent=parent, happy_hour=True)
bar.save_base(raw=True)

请记住,这可能会破坏任何新版本的Django。

票数 7
EN

Stack Overflow用户

发布于 2013-08-29 21:17:18

如果你不喜欢__dict__.update解决方案,你可以这样做:

代码语言:javascript
复制
for field in parent_obj._meta.fields
    setattr(child_obj, field.attname, getattr(parent_obj, field.attname))
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4064808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档