django,_base_manager 和对象之间的区别
django, difference between _base_manager and objects
django 内部代码使用 _base_manager
而不是 objects
还有_default_manager
我比较习惯用objects
有什么区别?
'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
我提供了修复它的补丁,但还没有应用。
django 内部代码使用 _base_manager
而不是 objects
还有_default_manager
我比较习惯用objects
有什么区别?
'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 我提供了修复它的补丁,但还没有应用。