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