AttributeError:'Manager'对象没有属性'get_by_natural_key'

Zam*_*tta 4 django django-models

我在Python 3.2.3上使用Django 1.5.

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

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

奇怪的是,无论如何它创造了桌子,但是现在,我很困惑,因为我真的没有得到我应该做的.文档说我应该创建一个自定义用户管理器,但这就是它真正说的.它没有给我一个线索在哪里创建它或如何.我查看了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']
Run Code Online (Sandbox Code Playgroud)

如何编写自定义用户管理器?我把它作为一种方法放在MyUsr模型中吗?或者甚至是我应该做的?我应该做一些完全不同的事吗?我现在还不确定.我只是不明白.关于这一点的文件对我来说似乎并不清楚,为解释留下了很多空间.我是Django的新手,但我已经使用了几个月的Python.

pzt*_*ick 13

您可以通过对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)
    ...
Run Code Online (Sandbox Code Playgroud)

您必须为您定义create_usercreate_superuser方法BaseUserManager.查看文档.

  • 如果你直接子类`UserManager`你已经实现了这些方法!https://docs.djangoproject.com/en/dev/ref/contrib/auth/#manager-methods (2认同)