【问题标题】:Django models: add index on date, desc orderDjango 模型:添加日期索引,降序顺序
【发布时间】:2015-12-18 22:00:32
【问题描述】:

我正在尝试让 Django 模型按降序 (DESC) 顺序在日期字段上为我创建一个索引,但我找不到这样做的方法。基本上,我需要执行以下 SQL(在 Posgres 中):

CREATE INDEX "idx_name" ON "table" ("date" DESC);

我能得到的最接近的方法是将db_index=True 添加到生成以下 SQL 的模型中:

CREATE INDEX "idx_name" ON "table" ("date");

关闭,但不完全是。 DESC 在这里有很大的不同,因为我的查询返回了从最新到最旧的对象。

我知道我可以将原始 sql 添加到迁移中,但如果 Django 能帮我解决它会更好。

有什么想法吗?

谢谢!

【问题讨论】:

标签: python django indexing


【解决方案1】:

我相信从 Django 1.11 开始支持您所追求的。

class Meta:
    indexes = [
        models.Index(fields=['last_name', 'first_name',]),
        models.Index(fields=['-date_of_birth',]),
    ]

官方参考herehererelease notes

【讨论】:

    【解决方案2】:

    您必须使用原始 SQL 来根据需要创建降序索引,但有几种方法可以在不创建它的情况下获得类似的结果。

    您可以通过将db_index=True 添加到字段并将ordering = ['-date'] [4] 添加到模型的元数据来实现所需的功能。

    如果您只按单列排序,那么使用 Django 的 ordering 和 Postgres 不一定很昂贵。 Postgres 计划器/优化器将决定 [2, 3] 是使用索引还是全表扫描并排序以形成关系。

    要仅在单个 QuerySet 基础上执行排序,您可以使用 order_by [1] 方法。来自 Django 文档:

    Entry.objects.filter(pub_date__year=2005).order_by('-pub_date', 'headline')
    

    上面的结果将按 pub_date 降序排列,然后按 标题上升。 “-pub_date”前面的负号 表示降序。

    另一种不使用原始 SQL 的解决方案是添加索引字段,然后使用 QuerySet 的reverse() [0] 方法,您尝试使用该方法以降序获取date 字段。这也需要db_index=True 并为该字段定义默认的order_by。此方法与设置 ordering 的注意事项相同,因此如果您基于具有不同扫描方向的多个字段进行排序,请避开它​​。

    另一个解决方案是覆盖默认的 Django SQL 模板来创建索引。该模板位于django.db.backends.base.schema.sql_create_index [5],但如果这样做,您可能会遇到无法预料的错误。

    引用,因为我不能发布超过两个链接:https://bpaste.net/raw/6001004893c1

    【讨论】:

    • 我实际上是在我的查询中这样做的。我需要通过创建索引来提高速度。
    • 好的,我正在更新我的答案以反映数据库而不是查询中的变化。
    • 哇,不错的更新。周一早上我会在办公室测试这些选项,并让你知道它们中的任何一个是否有效。谢谢!
    • 这实际上对我不起作用,但我会选择作为接受的答案,因为它回答了我的问题(没有办法完全按照我的意愿行事,但还有其他一些方法取得相似的结果)
    猜你喜欢
    • 1970-01-01
    • 2012-09-02
    • 2020-01-23
    • 2010-11-09
    • 2010-10-27
    • 2011-09-18
    • 1970-01-01
    • 2021-02-02
    • 2020-07-17
    相关资源
    最近更新 更多