0

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

MyModel.objects.all()

我可以在不创建新的 MyModel 对象的情况下做到这一点。这如何/为什么起作用?

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

4

2 回答 2

5

什么是 Model.objects

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

YourModel.objects

Manager 是进行 SQL 查询的人,例如,这将返回一个QuerySet

YourModel.objects.all()

QuerySet 的行为主要类似于普通的 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'

如果表不存在,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...
于 2013-02-14T14:40:37.373 回答
1

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

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

(我假设你的意思是问为什么你可以做MyModel.objects.all()而不是Model.objects.all()。正如 jpic 在他的回答中显示的那样,你不能做Model.objects.all()

于 2013-02-14T14:41:17.490 回答