Django 1.6 A.objects.all()。order_by(['field'])如果'field'是模型中的默认顺序,django会做什么?

pi

说我有一个问题模型:

class Question(models.Model):
    class Meta:
        ordering = ['title']
    user = models.ForeignKey(User) 
    title = models.CharField()

如果您在梅塔定义排序,它只是一个默认的设置,你少打字的话,那么的性能Question.objects.all().order_by(['title'])Question.objects.all()会一样吗?

弗拉基米尔·拉古诺夫(Vladimir Lagunov)

是的,性能是一样的。指定的Meta.ordering行为就像追加order_by到每个查询一样。

您可以通过设置logger的DEBUG级别来监视Django生成的SQL查询django.db.backends

示例模型:

class ModelA(models.Model):
    dummy = models.TextField()


class ModelB(models.Model):
    dummy = models.TextField()

    class Meta:
        ordering = ['dummy']

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=()
[]

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=()
[]

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=()
[]

更新:默认排序不会向数据库添加任何其他索引:

$ 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;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档