当在 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] 将使用table
、columns
和suffix
调用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_name
和column_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
的文件说:
使用
UniqueConstraint
与constraints
选项代替。
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允许设置约束名称(这是非常确定的)