我正在尝试集成一个第三方Django应用程序,它做出了继承django.contrib.auth.models.User的不幸决定,这是可插拔应用程序的一大禁忌。引用Malcolm Tredinnick
然而,更重要的是,就像在
中一样,你不能用Django的模型继承来“向下转换”。也就是说,如果您已经创建了User实例,那么如果不在幕后探索,就无法使该实例与您尚未创建的子类实例相对应。
好吧,我现在的情况是我需要将这个第三方应用程序与我现有的用户实例集成。所以,如果假设我真的愿意在被子下摸索,我有什么选择?我知道这不管用:
extended_user = ExtendedUser(user_ptr_id=auth_user.pk)
extended_user.save()也没有例外,但它打破了所有的东西,首先是用空字符串覆盖django.contrib.auth.models.User中的所有列……
发布于 2010-11-01 05:19:33
这应该是可行的:
extended_user = ExtendedUser(user_ptr_id=auth_user.pk)
extended_user.__dict__.update(auth_user.__dict__)
extended_user.save()在这里,您基本上只是将值从auth_user版本复制到extended_user版本中,然后重新保存它。不是很优雅,但很管用。
发布于 2015-05-18 14:14:14
我通过询问django用户邮件列表找到了这个答案:
https://groups.google.com/d/msg/django-users/02t83cuEbeg/JnPkriW-omQJ
这不是公共API的一部分,但您可以依赖于Django如何在内部加载fixture。
parent = Restaurant.objects.get(name__iexact="Bob's Place").parent
bar = Bar(parent=parent, happy_hour=True)
bar.save_base(raw=True)请记住,这可能会破坏任何新版本的Django。
发布于 2013-08-29 21:17:18
如果你不喜欢__dict__.update解决方案,你可以这样做:
for field in parent_obj._meta.fields
setattr(child_obj, field.attname, getattr(parent_obj, field.attname))https://stackoverflow.com/questions/4064808
复制相似问题