gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 21:39:07 25 4
gpt4 key购买 nike

假设我有一个问题模型:

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

如果你在 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']

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;

关于Django 1.6 A.objects.all().order_by( ['field' ]) 如果 'field' 是模型中的默认顺序,django 会做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21674248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com