[Solved]-Django, difference between _base_manager and objects

13👍

The difference between ‘objects’ and ‘_base_manager’ is that you can replace ‘objects’ with custom manager, but ‘_base_manager’ will be the default django.db.models.Manager instance anyway. In general, you should’n be using ‘_base_manager’. Sometimes Django itself needs to use ‘_base_manager’ to be sure of it’s 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’ll give one more 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'

So, is you set custom manager to model, it won’t have ‘objects’ attribute, but it still will have ‘_default_manager'(your custom manager instance) and ‘_base_manager’ – django.db.models.Manager instance.

Also be aware that there’s a bug in Django source code related to managers according to my ticket:
https://code.djangoproject.com/ticket/25897
I provided the patch to fix it, but it hasn’t been applied yet.

Leave a comment