【问题标题】:Create index on nested element JSONField for Postgres in Django在 Django 中为 Postgres 的嵌套元素 JSONField 创建索引
【发布时间】:2022-11-30 04:33:17
【问题描述】:

我的 python 项目中有一个 Django 模型,其中有一个元类详细说明了它的索引。我很好奇是否有办法使用 json 对象的嵌套路径创建索引。在这种情况下,我们知道 json 的结构,我想在特定元素上坚持使用 BTree 或哈希索引。

如果我只是将它作为原始 sql 运行,我希望只做类似的事情:

CREATE INDEX ON foster_data(root->'level_1'->'level_2'->>'name');

我希望我可以在我的模型中做这样的事情:

from django.db import models
from django.contrib.postgres import indexes

class ParentGuardians(Facilitators): # which extends models.Model
    parent_identifier = models.IntegerField(db_column='p_id', default=None, blank=True,
                                           null=True)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['table_id', name='UniqueConstraint for Parents')
        ]
        indexes = [
            models.Index(fields=['p_id', ]),
            indexes.BTreeIndex(fields=[models.JSONField('{"root": {"level_1": {"level_2": "name"}}}'), ]
                        ,  name="jsonb_p_id_idx"),
        ]

甚至:

...
            indexes.BTreeIndex(fields=["root->'level_1'->'level_2'->>'name'", ]
...

但是命名字段fields 只需要字符串并且只希望它们是模型中定义的顶级字段。

我知道这个问题:Indexing JSONField in Django PostgreSQL 但它似乎更像是一个 hack 并且想要从代码库和 makemigrations 生成的结果,而不是手动编辑它。这可能是最近吗?

【问题讨论】:

    标签: python django postgresql


    【解决方案1】:

    Django 3.2 引入了对这些索引的原生支持。

    目前所问的问题似乎没有 JSONField 的定义,但假设它类似于

    from django.db import models
    
    class Facilitators(models.Model):
        foster_data = models.JSONField()
    

    要索引特定键,您可以将 F expressionthe model's Meta indexes option 上的 JSONField path lookup 结合起来:

    from django.contrib.postgres.fields import JSONField   
    
    class Facilitators(models.Model):
        foster_data = models.JSONField()
        class Meta:
            indexes = [
                models.Index(models.F("foster_data__root__level_1__level2__name"), name="foster_data__root__level_1__level2__name_idx"),
            ]
    

    This will create a B-Tree index. 如果您要将这些添加到现有模型中,请务必makemigrations and migrate

    也请参阅此答案https://stackoverflow.com/a/74619523/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-16
      • 2019-07-28
      • 2016-10-26
      • 2014-06-06
      • 2017-06-28
      • 1970-01-01
      • 2016-04-19
      • 2019-09-26
      相关资源
      最近更新 更多