"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})