django,_base_manager和对象之间的区别

时间:2015-12-23 02:42:22

标签: django django-managers

django内部代码使用_base_manager代替objects

还有_default_manager

我更习惯使用objects

有什么区别?

1 个答案:

答案 0 :(得分:4)

'objects'和'_base_manager'之间的区别在于你可以用自定义管理器替换'objects',但'_base_manager'仍然是默认的django.db.models.Manager实例。一般来说,你应该使用'_base_manager'。有时Django本身需要使用'_base_manager'来确定它的行为。

from django.db import models


class CommentManager(models.Manager):
    pass


class Comment(models.Model):
    ...
    objects = CommentManager()

print(type(Comment.objects)) #<class 'main.models.CommentManager'>
print(type(Comment._default_manager)) #<class 'main.models.CommentManager'>
print(type(Comment._base_manager)) #<class 'django.db.models.manager.Manager'>

为了解释'_default_manager',我将举一个简单的例子:

class Comment(models.Model):
    ...
    custom_objects = CommentManager()

print(type(Comment._default_manager)) #<class 'main.models.CommentManager'>
print(type(Comment._base_manager)) #<class 'django.db.models.manager.Manager'>
print(type(Comment.objects)) #AttributeError: type object 'Comment' has no attribute 'objects'

那么,你是否将自定义管理器设置为模型,它不会有'objects'属性,但它仍然会有'_default_manager'(你的自定义管理器实例)和'_base_manager' - django.db.models.Manager实例

另请注意,根据我的机票,Django源代码中存在与管理器相关的错误: https://code.djangoproject.com/ticket/25897 我提供了补丁来修复它,但它尚未应用。