django模型对象...为什么我不必创建对象?

Chr*_*nch 0 django

我注意到django中的模型对象我能做到:

MyModel.objects.all()
Run Code Online (Sandbox Code Playgroud)

我可以在不创建新的MyModel对象的情况下完成此操作.这是如何工作的?

编辑了这个问题:我不是在询问基础Model类,但我在讨论一个名为MyModel的模型,该模型从基础Model类扩展而来

jpi*_*pic 5

什么是Model.objects

模型类,有一个Manager类,你可以这样得到它:

YourModel.objects
Run Code Online (Sandbox Code Playgroud)

管理器是进行SQL查询的管理器,例如,它将返回一个QuerySet:

YourModel.objects.all()
Run Code Online (Sandbox Code Playgroud)

一个查询集的行为大多是像一个正常的Python列表,但它将使SQL查询当它第一次评估.

基础模型类没有经理!

所以你不能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'
Run Code Online (Sandbox Code Playgroud)

如果表不存在,QuerySet将失败!

它会抛出一个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...
Run Code Online (Sandbox Code Playgroud)