我在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几个月了。
答案 0 :(得分:13)
您可以通过对 BaseUserManager 进行子类化并在模型中将其分配给对象属性来定义自定义管理器。
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)
...
您必须为create_user
定义create_superuser
和BaseUserManager
方法。请参阅docs。