Django postgres唯一约束名称生成

Mar*_*eux 2 django postgresql

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

例如我使用这个模型

class MyModel(Model):
  field1 = TextField()
  field2 = IntegerField()

  class Meta:
    unique_together = ("field1", "field2")
Run Code Online (Sandbox Code Playgroud)

我得到了约束的名称

select constraint_name
from information_schema.constraint_column_usage
where table_name = 'myapp_mytable'
Run Code Online (Sandbox Code Playgroud)

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

Wil*_*sem 5

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

\n
\n
if name is None:\n    name = IndexName(table, columns, "_uniq", create_unique_name)
Run Code Online (Sandbox Code Playgroud)\n
\n

\ IndexNamexc2\xa0 [GitHub]create_unique_name使用table,columns和进行调用suffix

\n
\n
class IndexName(TableColumns):\n    \n    def __init__(self, table, columns, suffix, create_index_name):\n        # …\n        pass\n\n    def __str__(self):\n        return self.create_index_name(self.table, self.columns, self.suffix)
Run Code Online (Sandbox Code Playgroud)\n
\n

并且create_unique_name将返回 的引用版本_create_index_name,这将生成和\xc2\xa0 [GitHub]摘要table_namecolumn_names

\n
\n
def _create_index_name(self, table_name, column_names, suffix=""):\n    # …\n    _, table_name = split_identifier(table_name)\n    hash_suffix_part = "%s%s" % (\n        names_digest(table_name, *column_names, length=8),\n        suffix,\n    )\n    # …
Run Code Online (Sandbox Code Playgroud)\n
\n

但使用unique_together可能会被弃用。事实上,文档上unique_together说\xc2\xa0 [Django-doc]

\n
\n

请使用UniqueConstraint\xc2\xa0 [Django-doc] \n 和\n constraints\xc2\xa0 [Django-doc] \n选项。

\n

UniqueConstraint\xc2\xa0 [Django-doc] \n提供比unique_together. unique_together\n将来可能会被弃用。

\n
\n

您可以定义它UniqueConstraint,也可以手动指定约束的名称:

\n
from django.db import models\n\nclass MyModel(models.Model):\n    field1 = models.TextField()\n    field2 = models.IntegerField()\n\n    class Meta:\n        constraints = [\n            models.UniqueConstraint(fields=(\'field1\', \'field2\'), name=\'some_constraint_name\')\n        ]
Run Code Online (Sandbox Code Playgroud)\n