2015-12-23 3 views
3

Джанго внутренний код использует _base_manager вместо objectsДжанго, разница между _base_manager и объекты

Существует также _default_manager

Я больше привык к использованию objects

В чем разница?

+0

Я очень хотел бы поддержать этот вопрос, но моя политика запрещает мне, когда автор не принял ответ, который дает решение. – raratiru

ответ

3

Разница между «объектами» и «_base_manager» заключается в том, что вы можете заменить «объекты» на пользовательский менеджер, но «_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' 

Итак, вы установили собственный менеджер модели, он не будет иметь атрибут «объектов», но все еще будут иметь _default_manager (ваш экземпляр пользовательского менеджера) и «_base_manager» - экземпляр django.db.models.Manager.

быть также известно, что есть ошибка в исходном коде Django связаны с менеджерами по моему билету: https://code.djangoproject.com/ticket/25897 я представил патч, чтобы исправить это, но она не была применена еще.