Django, difference between _base_manager and objects

Django's internal code uses _base_managerinsteadobjects

There is also _default_manager

I'm used to using objects

Who cares?

+4
source share
1 answer

The difference between "objects" and "_base_manager" is that you can replace "objects" with a user manager, but "_base_manager" will be the default instance of django.db.models.Manager by default. In general, you should not use '_base_manager'. Sometimes Django itself must use "_base_manager" to be sure of its behavior.

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'>

To explain "_default_manager", I will give you another simple example:

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 , .

+3

Source: https://habr.com/ru/post/1621368/


All Articles