"Create" child 来自 django 基础模型的模型
"Create" child model from base model in django
我有三个模型,一个名为 CommonUser(AbstractUser)
的基数和两个 children、Professional(CommonUser)
和 Client(CommonUser)
。
我正在使用 django-rest-social-auth 从 Facebook、Google 等创建用户,在我的设置中,我设置了 AUTH_USER_MODEL = 'users.CommonUser'
,但我有两个步骤来创建用户,首先使用社交登录,在此之后,我有一个表格来填写来自一类用户的其余数据。
我现在需要从 django-rest-social-auth 创建的 CommonUser 创建一个 Client 或 Professional 实例,换句话说,我想 "move" django-rest-social-auth 创建的 CommonUser 实例提交第二步表单后到客户端实例或专业实例。
经过一些测试和相关搜索,我找到了解决方案。
就我而言,在我将保存客户或专业用户的视图中,我将使用:
common_user = CommonUser.objects.get(id=id)
common_user.__class__ = Client
common_user.save()
编辑
上面的方法看起来不安全,第二次 this 讨论。
更多搜索,我找到了解决方案 here
基本上:
class CommonUser(AbstractUser):
# attributes...
@classmethod
def create_child(cls, child_class, attrs):
"""
Inputs:
- child_class: child class prototype
- attrs: dictionary of new attributes for child
"""
try:
id = attrs.pop('id', None)
common_user = CommonUser.objects.get(id=id)
except Exception as e:
raise e
parent_link_field = child_class._meta.parents.get(common_user.__class__, None)
attrs[parent_link_field.name] = common_user
for field in common_user._meta.fields:
value = getattr(common_user, field.name)
if value:
attrs[field.name] = value
s = child_class(**attrs)
s.save()
return s
class Professional(CommonUser):
# attributes...
class Client(CommonUser):
# attributes...
现在我可以表演了:
>>> professional = CommonUser.create_child(Professional, {'id': 1})
>>> client = CommonUser.create_child(Client, {'id': 2})
我有三个模型,一个名为 CommonUser(AbstractUser)
的基数和两个 children、Professional(CommonUser)
和 Client(CommonUser)
。
我正在使用 django-rest-social-auth 从 Facebook、Google 等创建用户,在我的设置中,我设置了 AUTH_USER_MODEL = 'users.CommonUser'
,但我有两个步骤来创建用户,首先使用社交登录,在此之后,我有一个表格来填写来自一类用户的其余数据。
我现在需要从 django-rest-social-auth 创建的 CommonUser 创建一个 Client 或 Professional 实例,换句话说,我想 "move" django-rest-social-auth 创建的 CommonUser 实例提交第二步表单后到客户端实例或专业实例。
经过一些测试和相关搜索,我找到了解决方案。
就我而言,在我将保存客户或专业用户的视图中,我将使用:
common_user = CommonUser.objects.get(id=id)
common_user.__class__ = Client
common_user.save()
编辑
上面的方法看起来不安全,第二次 this 讨论。
更多搜索,我找到了解决方案 here
基本上:
class CommonUser(AbstractUser):
# attributes...
@classmethod
def create_child(cls, child_class, attrs):
"""
Inputs:
- child_class: child class prototype
- attrs: dictionary of new attributes for child
"""
try:
id = attrs.pop('id', None)
common_user = CommonUser.objects.get(id=id)
except Exception as e:
raise e
parent_link_field = child_class._meta.parents.get(common_user.__class__, None)
attrs[parent_link_field.name] = common_user
for field in common_user._meta.fields:
value = getattr(common_user, field.name)
if value:
attrs[field.name] = value
s = child_class(**attrs)
s.save()
return s
class Professional(CommonUser):
# attributes...
class Client(CommonUser):
# attributes...
现在我可以表演了:
>>> professional = CommonUser.create_child(Professional, {'id': 1})
>>> client = CommonUser.create_child(Client, {'id': 2})