【问题标题】:Django db_index=True not creating index, but class Meta indexes yesDjango db_index=True 不创建索引,但类 Meta 索引是
【发布时间】:2019-05-26 17:38:33
【问题描述】:

在我的 django 模型中,在字段定义中通过 db_index=True 创建索引时,不会创建索引。仅当我在 Meta 类中创建时

class Agreement(UUIDPrimaryKey):
  job = models.ForeignKey(           
    'posts.Job',                   
    on_delete=models.CASCADE,      
    verbose_name=_("job"),         
  )
  class Meta:
    indexes = (
      models.Index(fields=['job']),
    )

如果我运行 makemigrations,就会创建索引。

Create index agreements__job_id_eb7df0_idx on field(s) job of model agreement

但如果我将模型更改为:

class Agreement(UUIDPrimaryKey):
  job = models.ForeignKey(           
    'posts.Job',                   
    on_delete=models.CASCADE,      
    verbose_name=_("job"),
    db_index=True,
  )

我运行 makemigrations,索引被删除。

 Remove index agreements__job_id_eb7df0_idx from agreement

两个定义不应该相同吗?

更新

文档说它们是相同的。是的,两者都创建索引。但如果您在 Meta 中创建索引,并且未在字段定义中指定 db_index=False,则会创建两个索引

这是在字段中设置 db_index=False 之前

psql# select indexname from pg_indexes where tablename like 'agreemen%';

                 indexname                  
--------------------------------------------
 agreements__job_id_eb7df0_idx
 agreements_agreement_job_id_id_c26bd828
 agreements_agreement_pkey

在设置 db_index=False 并运行迁移/迁移之后

           indexname           
-------------------------------
 agreements__job_id_eb7df0_idx
 agreements_agreement_pkey

【问题讨论】:

    标签: django indexing


    【解决方案1】:

    在 ForeignKey 上自动创建一个数据库索引。至少文档是这样说的:https://docs.djangoproject.com/en/2.1/ref/models/fields/#foreignkey。所以没有必要在模型的 ForeignKey 字段中设置db_index=True。如果您不想要索引 (db_index=False),该选项仍然存在。

    【讨论】:

      猜你喜欢
      • 2019-12-30
      • 1970-01-01
      • 2017-05-25
      • 2013-01-25
      • 1970-01-01
      • 2022-11-24
      • 2010-11-04
      • 1970-01-01
      • 2021-11-13
      相关资源
      最近更新 更多