#はじめに
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)