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

时间:2013-02-14 14:05:33

标签: django

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

MyModel.objects.all()

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

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

2 个答案:

答案 0 :(得分:5)

什么是Model.objects

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

YourModel.objects

管理员是进行SQL查询的人,例如,这将返回QuerySet

YourModel.objects.all()

QuerySet的行为大致类似于普通的python列表,但它会在第一次evaluated时进行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'

如果表不存在,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...

答案 1 :(得分:1)

如果您定义模型class MyModel(models.Model)然后运行python manage.py syncdb,django将创建数据库表yourapp_mymodel。您可以针对不返回元组的db表运行查询,因此您可以创建不包含任何结果的查询集 - 例如MyModel.objects.none()

如果每次运行没有返回结果的查询时它都抛出异常,那么queryset api将毫无希望。

(我原以为你打算问为什么你可以做MyModel.objects.all()而不是Model.objects.all()。正如jpic在他的回答中所说,你不能做Model.objects.all()