私ができるdjangoのモデルオブジェクトで気づいた:
MyModel.objects.all()
新しい MyModel オブジェクトを作成せずにこれを行うことができます。これはどのように/なぜ機能するのですか?
質問を編集しました: 基本モデル クラスについて質問しているわけではありませんが、基本モデル クラスから拡張された MyModel というモデルについて話しているのです。
私ができるdjangoのモデルオブジェクトで気づいた:
MyModel.objects.all()
新しい MyModel オブジェクトを作成せずにこれを行うことができます。これはどのように/なぜ機能するのですか?
質問を編集しました: 基本モデル クラスについて質問しているわけではありませんが、基本モデル クラスから拡張された MyModel というモデルについて話しているのです。
モデル クラスにはManager クラスがあり、次のように取得できます。
YourModel.objects
Manager は SQL クエリを作成するものです。たとえば、これはQuerySetを返します。
YourModel.objects.all()
QuerySetは、最初に評価されるときに SQL クエリを作成することを除いて、通常の Python リストとほとんど同じように動作します。
したがって、あなたが言ったようにすることはできませんModel.objects.all()
:
In [1]: from django.db.models import Model
In [2]: Model.objects
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
/home/jpic/env/local/lib/python2.7/site-packages/django/core/management/commands/shell.pyc in <module>()
----> 1 Model.objects
AttributeError: type object 'Model' has no attribute 'objects'
DatabaseError がスローされます。
50 def execute(self, query, args=None):
51 try:
---> 52 return self.cursor.execute(query, args)
53 except Database.IntegrityError, e:
54 raise utils.IntegrityError, utils.IntegrityError(*tuple(e)), sys.exc_info()[2]
DatabaseError: relation "formapp_testmodel" does not exist
LINE 1: SELECT "formapp_testmodel"."id" FROM "formapp_testmodel" LIM...
モデルを定義してclass MyModel(models.Model)
実行するpython manage.py syncdb
と、django はデータベース テーブルを作成しますyourapp_mymodel
。タプルを返さないその db テーブルに対してクエリを実行できるため、結果を含まないクエリセットを作成できますMyModel.objects.none()
。
結果を返さないクエリを実行するたびに例外をスローする場合、クエリセット API はかなり絶望的です。
(私はあなたがなぜあなたができるのではMyModel.objects.all()
なくできるのかを尋ねるつもりModel.objects.all()
だったと思いました.jpicが彼の答えで示しているように、あなたはできないModel.objects.all()
.