django内部代码使用_base_manager
代替objects
还有_default_manager
我更习惯使用objects
有什么区别?
答案 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 我提供了补丁来修复它,但它尚未应用。