Django.db.utils.ProgrammingError: ограничение уже существует
Итак, я пытаюсь сделать свой собственный файл миграции для создания разделов для моих таблиц, я создал пользовательскую CreatePartitionedModel, чтобы сделать работу за меня, но я продолжаю получать db.utils.ProgrammingError, говоря, что у меня есть дублирование в моих ограничениях:
django.db.utils.ProgrammingError: constraint "summary_result_id_d5ba54ba_fk_token_id"
for relation "summary" already exists
Моя пользовательская CreateModel :
class CreatePartitionedModel(CreateModel):
def __init__(self, name, fields, partition_sql='LIST(lang)', **kwargs):
self.partition_sql = partition_sql
super().__init__(name, fields, **kwargs)
def database_forwards(self, app_label, schema_editor, from_state, to_state):
collector = type(schema_editor)(
schema_editor.connection, collect_sql=True, atomic=False
)
with collector:
super().database_forwards(
app_label, collector, from_state, to_state
)
collected_sql = collector.collected_sql
schema_editor.deferred_sql.extend(
collector.deferred_sql
)
model = to_state.apps.get_model(app_label, self.name)
create_table = 'CREATE TABLE %s' % schema_editor.quote_name(
model._meta.db_table
)
all_langs = ['en','fr','ar','es','da','de','it','ja','nl','pl','pt','ru','zh']
langs_partition = ""
for sql in collected_sql:
if str(sql).startswith(create_table):
for lang in all_langs:
langs_partition+=f"create table {self.options['db_table']}_{lang} partition of {self.options['db_table']} for values in ('{lang}');"
primary_keys = ",primary key (id ,lang ),unique ( lang, id))"
sql = sql.replace("serial NOT NULL PRIMARY KEY","serial NOT NULL")
sql = '%s %s PARTITION BY %s; %s' % (sql.rstrip(');'), primary_keys,self.partition_sql, langs_partition)
schema_editor.execute(sql)
а это мой файл миграции и таблица, в которой у меня возникли проблемы:
CreatePartitionedModel(
name='Summary',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('base', models.CharField(max_length=255)),
('pattern', models.CharField(max_length=255)),
('lang', models.CharField(max_length=255)),
('frequency', models.IntegerField()),
('relevance', models.FloatField(null=True)),
('count', models.FloatField(null=True)),
('result', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='results', to='main.token')),
],
options={
'db_table': 'summary',
},
),