| この記事の要点 |
|
背景
Django でモデルを作って save() したあと、「いまこのインスタンスにはどんな値が入っているのか」を確認したい場面は頻繁にあります。フォームから受け取った値・自動付与された ID・signal で書き換わった値などを、デバッグ時に素早く見るための定番手段を整理します。
1. 最短: __dict__ で覗く
Python のオブジェクトは内部の属性辞書を __dict__ で取り出せます。Django のモデルインスタンスもこれが効きます。
from myapp.models import SampleModel
obj = SampleModel.objects.get(id=1)
print(obj.__dict__)
出力イメージ:
{
'_state': <django.db.models.base.ModelState object at 0x...>,
'id': 1,
'name': 'sample',
'price': 1200,
'category_id': 3,
'created_at': datetime.datetime(2026, 6, 11, 10, 0, 0, ...),
}
このダンプには次のような特徴があります。
- 先頭の
_stateは Django 内部用(DB 接続情報・new/old 判定)。無視して OK - 外部キーは 属性名 +
_id(例:category_id)で生 ID が入る - ManyToMany は
__dict__に出てこない(中間テーブル経由のため) - DB から取得した直後は
_state.adding == False、新規SampleModel(id=1)しただけだとTrue
見栄え重視で確認したいときは pprint が便利です。
from pprint import pprint
pprint(obj.__dict__)
2. Django shell で対話確認
対話的に試すなら manage.py shell がもっとも手軽です。プロジェクトの設定を読み込んだ状態で Python REPL に入れます。
python manage.py shell>>> from myapp.models import SampleModel
>>> obj = SampleModel.objects.get(pk=1)
>>> obj.__dict__
>>> dir(obj) # 利用可能な属性・メソッド一覧
>>> obj._meta.get_fields() # モデル定義上のフィールド一覧
外部パッケージ django-extensions を入れていれば python manage.py shell_plus でモデルが自動 import されるため、import 文を書かずに即座に試せます。
3. モデル定義そのものを確認: _meta
__dict__ はインスタンスの値ですが、_meta は「モデル定義」を持つ内部 API です。フィールド名・型・関連の方向などを動的に取り出せます。
for f in SampleModel._meta.get_fields():
print(f.name, type(f).__name__)
出力例:
id AutoField
name CharField
price IntegerField
category ForeignKey
created_at DateTimeField
4. 関連オブジェクト(FK / M2M)を実体で見る
__dict__ に出るのは ID だけなので、関連先の実データを見たいときは属性経由で取得します。
obj = SampleModel.objects.select_related('category').get(pk=1)
print(obj.category) # 関連先のインスタンス
print(obj.category.__dict__) # その中身
# ManyToMany
for tag in obj.tags.all():
print(tag.name)
select_related / prefetch_related を付けずに obj.category を参照すると、追加 SQL が発行されます(N+1 問題)。
5. SQL ログを確認する
「内部でどんな SQL が発行されたか」を見たいときは django.db.connection.queries を使います(DEBUG=True のとき有効)。
from django.db import connection, reset_queries
reset_queries()
obj = SampleModel.objects.get(pk=1)
print(obj.category.name)
for q in connection.queries:
print(q['time'], q['sql'])
本格的にチューニングするなら django-debug-toolbar をインストールして、画面右側のパネルから 1 リクエスト分の SQL とテンプレ描画時間を可視化するのが定番です。
6. 「保存前」と「保存後」の差分を見る
フォームから受け取った値が DB に書き込まれる前にどう変わったか、を確認したい場合は pre_save / post_save シグナルや、モデルの _state.adding を見るのが定石です。
obj = SampleModel(name='draft')
print(obj._state.adding) # True(DB に未保存)
obj.save()
print(obj._state.adding) # False
print(obj.__dict__) # id が割り当てられている
7. シリアライズして JSON で見る
API レスポンスと同じ形式で見たい場合は、DRF の ModelSerializer や Django 標準の django.core.serializers を使います。
from django.core.serializers import serialize
print(serialize('json', [obj], indent=2))
よくあるハマり所
__dict__に M2M は出ない →obj.tags.all()で個別取得__dict__にproperty経由の派生値は出ない →vars(obj)でも同じ。属性アクセスする- DB から取り直さずに変更後の状態を見ると古い値が残る →
obj.refresh_from_db()で再ロード - signal で書き換わる項目は
save()後の__dict__で確認する
関連
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38