はじめに
先日業務の中でDjangoの仕様であるobjects
につまづいてしまったので、この機会にobjects
が使える条件など調べた情報をまとめます。
初歩的な内容になってしまうかもしれませんが、知識の確認がてらにでもご覧ください。
そもそも'objects'とは?
このobjects
とはモデルマネージャー
と呼ばれるものです。
データベースから任意のデータを操作する際などによく使われます
Djangoでは、モデル名.objects
のようにすると様々なことができます。
具体例
name | price |
---|---|
apple | 100 |
orange | 100 |
banana | 150 |
from app.models import Item
items = Item.objects.filter(price=100)
上記ではモデルマネージャー
であるobjects
にモデルマネージャーのメソッド
であるfilter()
が連結され、'price'が100である'apple'と'orange'が取り出されています。
objectsが必要な場合
結論
モデルクラスに対してモデルマネージャのメソッドを使う場合
です!
具体例
# 先ほどと同じ記述です
from app.models import Item
items = Item.objects.filter(price=100)
このように、モデルクラスに対してfilter()メソッドのようなモデルマネージャのメソッドを使うときは
モデルクラス(Item).モデルマネージャ(objects).モデルマネージャのメソッド(filter())
と記述します。
objectsが不要な場合
結論
クエリセットインスタンスに対してモデルマネージャのメソッドを使う場合
です!
具体例
1 from app.models import Item
# filter()はクエリセットを返す
2 items = Item.objects.filter(price=100)
3 items = items.order_by('name')
二行目の記述でitems
にはfilter()が返したクエリセットインスタンスが代入されています。
このため、三行目では
items.objects.order_by('name')
とする必要がありません。
おまけ
モデルマネージャのメソッドは、クエリセットインスタンスに対して連結して記述できます。
from app.models import Item
# filter()はクエリセットを返すので、order_by()を連結できる
items = Item.objects.filter(price=100).order_by('name')
参考
[【初心者向け】Djangoのモデル操作でobjectsが必要な場合・不要な場合を理解する]
(https://qiita.com/shonansurvivors/items/12b087cf5ab591273c8c)
[Django データベース操作 についてのまとめ]
(https://qiita.com/okoppe8/items/66a8747cf179a538355b)