说我有一个问题模型:
class Question(models.Model):
class Meta:
ordering = ['title']
user = models.ForeignKey(User)
title = models.CharField()
Run Code Online (Sandbox Code Playgroud)
如果您在Meta中定义排序,它是否只是一个默认设置,您可以键入较少的单词,所以性能Question.objects.all().order_by(['title'])和Question.objects.all()将是相同的?
是的,表现是一样的.指定Meta.ordering行为完全类似于附加order_by到每个查询.
您可以通过为记录器设置DEBUG级别来观察Django生成的SQL查询django.db.backends.
示例模型:
class ModelA(models.Model):
dummy = models.TextField()
class ModelB(models.Model):
dummy = models.TextField()
class Meta:
ordering = ['dummy']
Run Code Online (Sandbox Code Playgroud)
SQL查询示例:
>>> import logging
>>> l = logging.getLogger('django.db.backends')
>>> l.setLevel(logging.DEBUG)
>>> l.addHandler(logging.StreamHandler())
>>> from sqlorder.models import ModelA, ModelB
>>> ModelA.objects.all()
(0.111) SELECT "sqlorder_modela"."id", "sqlorder_modela"."dummy"
FROM "sqlorder_modela" LIMIT 21; args=()
[]
Run Code Online (Sandbox Code Playgroud)
ModelA默认情况下没有排序,因此ModelA.objects.all不会追加ORDER BY查询.您可以手动附加它.
>>> ModelA.objects.order_by('dummy')
(0.001) SELECT "sqlorder_modela"."id", "sqlorder_modela"."dummy"
FROM "sqlorder_modela"
ORDER BY "sqlorder_modela"."dummy" ASC LIMIT 21; args=()
[]
Run Code Online (Sandbox Code Playgroud)
ModelB有默认排序.查询ModelA与手动添加相同order_by.
>>> ModelB.objects.all()
(0.001) SELECT "sqlorder_modelb"."id", "sqlorder_modelb"."dummy"
FROM "sqlorder_modelb"
ORDER BY "sqlorder_modelb"."dummy" ASC LIMIT 21; args=()
[]
Run Code Online (Sandbox Code Playgroud)
更新: 默认排序不会向数据库添加任何其他索引:
$ python manage.py sqlall sqlorder
BEGIN;
CREATE TABLE "sqlorder_modela" (
"id" serial NOT NULL PRIMARY KEY,
"dummy" text NOT NULL
)
;
CREATE TABLE "sqlorder_modelb" (
"id" serial NOT NULL PRIMARY KEY,
"dummy" text NOT NULL
)
;
COMMIT;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4164 次 |
| 最近记录: |