gpt4 book ai didi

django,_base_manager 和对象的区别

转载 作者:行者123 更新时间:2023-12-04 19:51:00 24 4
gpt4 key购买 nike

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 和对象的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34427817/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com