Django用户帐户,扩展帐户

时间:2013-11-21 18:14:27

标签: python django django-models django-users

我正在尝试扩展Django的用户帐户帐户模型,以向其添加一组其他字段。问题是“帐户”对象有一组检查一些参数的方法,我想重新使用所有代码。因此,我想到的第一件事是使用我自己的类扩展Account类:

class snAccount(Account):

    account = models.OneToOneField(Account, related_name="sn_account", verbose_name=_("snAccount"))

    # Extra fields
    organization = models.CharField(_("language"), ...,  )    
    country = CountryField()

    @classmethod
    def create(cls, request=None, **kwargs):
        create_email = kwargs.pop("create_email", True)
        user = kwargs.pop("user", None)
        acc = Account.create(request, user=user, create_email=create_email)
        x_account = cls(**kwargs)
        #x_account.user = request.user
        x_account.save()
        return x_account

问题是,每次我想保存这个“扩展”帐户类时,我都会遇到以下异常:

Exception Type:     IntegrityError
Exception Value:    (1048, "Column 'user_id' cannot be null")

如果我将用户字段直接添加到扩展帐户(取消注释“#x_account.user = request.user”行,我会收到以下错误:

Exception Type:     IntegrityError
Exception Value:    (1062, "Duplicate entry '1' for key 'user_id'")

我认为这个字段将直接从Account模型继承,没有明确声明该字段。我究竟做错了什么?这是正确的做法,还是我最好创建一个不扩展Account类但仍然通过ForeignKey字段链接到它的模型?

2 个答案:

答案 0 :(得分:1)

如何做到这一点在Django Substituting a custom User model下已有详细记载。

答案 1 :(得分:0)

问题是因为在对模型进行子类化时,django会在新模型中创建一个指向基本模型的*_ptr字段。在创建模型的新实例时,将创建包含属性的模型和包含基本属性的基础模型。

在这种情况下,如果您删除了Account.create(...)行,则django会同时为您的自定义字段创建snAccount,并为所有基本字段填充Account,并将它们链接在一起