Django中的默认管理器

时间:2014-07-13 11:48:03

标签: django django-models

当我没有定义任何经理时,我没有错误。但是,当我执行以下操作时:

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模型继承的。谢谢!

2 个答案:

答案 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中实现。如果您的用户模型与默认实现类似(即,它定义usernameemailis_staffis_activeis_superuser,{{1您可以使用last_logindate_joined字段)。否则,您必须创建UserManager的子类,并实施BaseUserManagercreate_user方法。

当您使用create_superuser作为基类时,可以使用AbstractUser类,或者如果需要定义任何其他方法,则可以使用UserManager的子类。

另请阅读custom user managers上的文档。