当我没有定义任何经理时,我没有错误。但是,当我执行以下操作时:
class User(AbstractUser):
# some fields
objects = model.Manager()
hstore_manager = hstore.HStoreManager()
我得到了
AttributeError at'Manager' object has no attribute 'get_by_natural_key'
此行上的身份验证方法中的/django/contrib/auth/backends.py存在问题:
user = UserModel._default_manager.get_by_natural_key(username)
请注意,User是从AbstractUser模型继承的。谢谢!
答案 0 :(得分:2)
好吧,如果您直接从AbstructUser继承,则会出现此错误。如果您与用户建立一对一的关系,那么您将不会收到此错误。例如:
class ExManager(models.Manager):
def get_queryset(self):
return super(ExManager, self).get_queryset().all()
class Post(models.Model):
user= models.OneToOneField(User)
title= models.CharField(max_length=150, null=True, default=None)
objects=models.Manager()
ab_ob= ExManager()
在django shell中我测试过:
In [2]: k=Post.ab_ob.all()
In [3]: k
Out[3]: []
In [4]: from django.contrib.auth.models import User
In [5]: u=User.objects.get(id=1)
In [6]: k1=Post(user=u, title="asdasd")
In [7]: k1.save()
In [8]: k2=Post.ab_ob.all()
In [9]: k2
Out[9]: [<Post: Post object>]
答案 1 :(得分:1)
身份验证框架期望User
对象上的默认管理器实现一些额外的方法。基本方法在django.contrib.auth.models.BaseUserManager
中实现,特定于模型的方法在django.contrib.auth.models.UserManager
中实现。如果您的用户模型与默认实现类似(即,它定义username
,email
,is_staff
,is_active
,is_superuser
,{{1您可以使用last_login
和date_joined
字段)。否则,您必须创建UserManager
的子类,并实施BaseUserManager
和create_user
方法。
当您使用create_superuser
作为基类时,可以使用AbstractUser
类,或者如果需要定义任何其他方法,则可以使用UserManager
的子类。
另请阅读custom user managers上的文档。