1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Django]objectsはどこで定義されてるのか

Posted at

#はじめに
Djangoではデータベースへアクセスする際データモデルを独自に定義する必要があります。
そしてviews.pyなどで以下のように書き、データを扱います。

app/views.py
from django.contrib.auth.models import User

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

このobjects変数はDjangoでデータモデルとデータベースを連結されるためのORMであるManagerクラスであると前回の記事に書きました

今回はこのobjects変数がどこで定義されているのかソースコードを辿って確認してみます。
##行ったこと

上記のUserクラスが定義されているdjango.contrib.auth.modelsを開きます。

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

辿ります。

django.contrib.auth.base_user.py
from django.db import models
...
class AbstractBaseUser(models.Model):
   ...

ここにもありません。さらに遡ります。

django/db/models/base.py
...
class Model(metaclass=ModelBase):
  ...

どうやらこのModelBaseにありそうです。

django/db/models/base.py
...
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]カスタムマネージャーを使う(https://blog.narito.ninja/detail/105)

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?