[Django] objects 的定义在哪里?

首先

在Django中,访问数据库时需要自定义数据模型。然后,在views.py等文件中以以下方式编写并处理数据。

from django.contrib.auth.models import User

def index(request):
  user=User.objects.all()

在上一篇文章中,我提到了这个objects变量是Django中用于将数据模型与数据库连接的ORM的Manager类。

这一次我们将追踪源代码,确认一下objects变量是在哪里定义的。

曾去過

打开django.contrib.auth.models文件,其中定义了名为User的类。

from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
  class Abstract(AbstractBaseUser,PermissionMixin):
    ...
  class User(AbstractUser):
    ...

我找到了。

from django.db import models
...
class AbstractBaseUser(models.Model):
   ...

这里没有。我们要继续往前找。

...
class Model(metaclass=ModelBase):
  ...

看起来似乎存在于这个ModelBase中。

...
class ModelBase(type):
  ...
  if not opts.managers:
      if any(f.name == 'objects' for f in opts.fields):
          raise ValueError(
              "Model %s must specify a custom Manager, because it has a "
              "field named 'objects'." % cls.__name__
          )
      manager = Manager()
      manager.auto_created = True
      cls.add_to_class('objects', manager)

  def add_to_class(cls, name, value):
        if _has_contribute_to_class(value):
            value.contribute_to_class(cls, name)
        else:
            setattr(cls, name, value)

我們使用 Python 內置函數`setattr()`在資料模型生成時為 objects 變數指派了 Manager 類別。

这意味着你可以自己创建一个独立的自定义管理器并将其赋值给”objects”。我会附上一个参考网站的链接,其中有关于如何创建自定义管理器的指南。

请参考以下网站

使用Django的自定义管理器

bannerAds