Django postgres unique constraint name generation



当在 django 模型上添加新的唯一约束时,这将在 postgres 中自动为此约束创建一个名称。 Postgres生成这个名字还是Django?它是确定性的吗?

例如,我使用这个模型

class MyModel(Model):
field1 = TextField()
field2 = IntegerField()
class Meta:
unique_together = ("field1", "field2")

我得到了约束的名称

select constraint_name
from information_schema.constraint_column_usage
where table_name = 'myapp_mytable'

我得到一个像field1_field2_d04755de_uniq这样的名字

Django 将确定这个名称。事实上,源代码 [GitHub] 显示它通过以下方式确定名称:

if name is None:
name =IndexName(table, columns, "_uniq", create_unique_name)

IndexName[GitHub] 将使用tablecolumnssuffix调用create_unique_name

class IndexName(TableColumns):

def __init__(self, table, columns, suffix, create_index_name):
# …
pass
def __str__(self):
return self.create_index_name(self.table, self.columns, self.suffix)

create_unique_name将返回_create_index_name的引用版本,这将对table_namecolumn_names进行摘要[GitHub]:

def _create_index_name(self, table_name, column_names, suffix=""):
# …
_, table_name = split_identifier(table_name)
hash_suffix_part= "%s%s" % (
names_digest(table_name, *column_names, length=8),
suffix,
)
# …

但是使用unique_together可能会被弃用。事实上,关于unique_together的文件说:

使用UniqueConstraintconstraints选项代替。

UniqueConstraint提供比unique_together更多的功能。unique_together将来可能会弃用。

您可以定义此UniqueConstraint还可以在其中手动指定约束的名称:

from django.db import models
class MyModel(models.Model):
field1 = models.TextField()
field2 = models.IntegerField()
class Meta:
constraints = [
models.UniqueConstraint(fields=('field1', 'field2'), name='some_constraint_name')
]

正如@willem-van-onsem所建议的那样,使用UniqueConstraint允许设置约束名称(这是非常确定的)

相关内容

最新更新