Django db_index =不创建索引,但是类元索引是

时间:2018-12-29 02:40:52

标签: django indexing

在我的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

1 个答案:

答案 0 :(得分:1)

将在ForeignKey上自动创建数据库索引。至少这样说:https://docs.djangoproject.com/en/2.1/ref/models/fields/#foreignkey。因此,无需在模型的ForeignKey字段中设置db_index=True。如果您不需要索引(db_index=False),该选项仍然存在。