当在 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
Django 将确定这个名称。事实上,源代码\xc2\xa0 [GitHub]显示它通过以下方式确定名称:
\n\n\nRun Code Online (Sandbox Code Playgroud)\nif name is None:\n name = IndexName(table, columns, "_uniq", create_unique_name)
\ IndexNamexc2\xa0 [GitHub]将create_unique_name使用table,columns和进行调用suffix:
\n\nRun Code Online (Sandbox Code Playgroud)\nclass 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)
并且create_unique_name将返回 的引用版本_create_index_name,这将生成和\xc2\xa0 [GitHub]的摘要table_namecolumn_names:
\n\nRun Code Online (Sandbox Code Playgroud)\ndef _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 # …
但使用unique_together可能会被弃用。事实上,文档上unique_together说\xc2\xa0 [Django-doc]:
\n\n请使用
\nUniqueConstraint\xc2\xa0 [Django-doc] \n 和\nconstraints\xc2\xa0 [Django-doc] \n选项。\n
UniqueConstraint\xc2\xa0 [Django-doc] \n提供比unique_together.unique_together\n将来可能会被弃用。
您可以定义它UniqueConstraint,也可以手动指定约束的名称:
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
| 归档时间: |
|
| 查看次数: |
771 次 |
| 最近记录: |