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

标签 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

最佳答案

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

关于Django db_index=True 不创建索引,但类元索引是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53966256/

相关文章:

python - django 导入导出不适用于 mptt

python - 将 Scrapy 与 Django 集成 : How to

arrays - 如何从 NumPy 中的二维数组获取多个坐标

php - 如何用数组 [INDEX] 元素替换 {tag_INDEX}

python - django UnitTest Case(模拟)中的假子函数

python - 在单元测试中将 kwargs 传递给基于类的 View

python - 格式错误的数据包 : Django admin nested form can't submit, 连接已重置

java - 查找数组中最高值的索引(Java)

python - Pandas - 在包含间隔的 MultiIndex 上建立索引

python - 如何返回不包括某些列的新数据框?