【问题标题】:Django user accounts, extending accountsDjango 用户帐户,扩展帐户
【发布时间】:2013-12-06 09:14:27
【问题描述】:

我正在尝试扩展 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

问题是每次我想保存这个“扩展”的 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 字段链接到它的模型?

【问题讨论】:

    标签: python django django-models django-users


    【解决方案1】:

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

    【讨论】:

    • 您提供的链接仅包含有关如何从 django.contrib.auth 直接扩展用户模型的文档,这很好;但我的问题是关于如何扩展 django-user-accounts 模型,该模型已经以您的链接属性的方式扩展了 django.contrib.auth 。
    • 最后,我认为我会遵循该链接中定义的模型,因为它可能是迄今为止最好的解决方案。
    【解决方案2】:

    问题是因为在子类化模型时,django 在新模型中创建了一个*_ptr 字段,该字段指向基础模型。在创建模型的新实例时,会同时创建具有您的属性的模型和具有基本属性的基本模型。

    在这种情况下,如果您删除了 Account.create(...) 行,django 将使用您的自定义字段创建 snAccount 和填写所有基本字段的 Account,并将它们链接在一起。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-12
      • 2014-10-28
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      相关资源
      最近更新 更多