【问题标题】:AttributeError: 'Manager' object has no attribute 'get_by_natural_key'AttributeError:“经理”对象没有属性“get_by_natural_key”
【发布时间】:2013-05-13 20:04:07
【问题描述】:

我在 Python 3.2.3 上使用 Django 1.5。

当我运行 python3 manage.py syncdb 时,它会构建数据库表,并询问我的电子邮件(定义为唯一的而不是用户名),然后当我输入该电子邮件时,我收到此错误 --

AttributeError: 'Manager' object has no attribute 'get_by_natural_key'

奇怪的是,它无论如何都会创建表格,但现在,我很困惑,因为我真的不明白我应该做什么。文档说我应该创建一个Custom User Manager,但这就是它真正所说的。它没有让我知道在哪里创建它或如何创建它。我查看了docs on Managers,但这并没有帮助我弄清楚任何事情。一切都太模糊了。我一直在谷歌上搜索,试图找到一些关于我需要做什么的线索,但我只是因为越来越多的问题而不是任何答案而发疯。这是我的 models.py 文件:

from django.db import models
from django.contrib.auth.models import AbstractBaseUser

class MyUsr(AbstractBaseUser):
    email = models.EmailField(unique=True,db_index=True)
    fname = models.CharField(max_length=255,blank=True, null=True)
    surname = models.CharField(max_length=255,blank=True, null=True)
    pwd_try_count = models.PositiveSmallIntegerField(blank=True, null=True)
    pwd_last_try = models.DateTimeField(blank=True, null=True)
    resetid = models.CharField(max_length=100,blank=True, null=True)
    last_reset = models.DateTimeField(blank=True, null=True)
    activation_code = models.CharField(max_length=100,blank=True, null=True)
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['fname','activation_code']

如何编写自定义用户管理器?我是否将其作为方法放入 MyUsr 模型中?或者这就是我应该做的?我应该做一些完全不同的事情吗?在这一点上,我不确定任何事情。我只是不明白。这方面的文档对我来说似乎并不清楚,留下了很多解释的余地​​。我对 Django 很陌生,但我已经接触 Python 好几个月了。

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    您可以通过将 BaseUserManager 子类化并将其在模型中分配给 objects 属性来定义自定义管理器。

    from django.contrib.auth.models import AbstractUser, BaseUserManager
    
    class MyMgr(BaseUserManager):
        def create_user(...):
            ...
    
        def create_superuser(...):
            ...
    
    
    class MyUsr(AbstractBaseUser):
        objects = MyMgr()
    
        email = models.EmailField(unique=True, db_index=True)
        fname = models.CharField(max_length=255, blank=True, null=True)
        ...
    

    您必须为您的BaseUserManager 定义create_usercreate_superuser 方法。请参阅docs

    【讨论】:

    猜你喜欢
    • 2019-06-14
    • 2013-01-21
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2012-12-01
    • 2021-04-19
    • 2021-11-22
    • 1970-01-01
    相关资源
    最近更新 更多