Невозможно указать внешний ключ в управляемой модели для неуправляемой модели (Django 3.2.7 / Postgresql 10.18)
Я реализую "модель профиля" в Django 3, которая в самом простом виде представляет собой модель с двумя полями: поле отношения один-к-одному к стандартной модели Django User и отношение внешнего ключа к неуправляемой модели TeamDim, которая заполняется и управляется ETL-заданием вне приложения Django. Я использую Postgresql 10 в качестве бэкенда БД.
У меня не было проблем с созданием исходной таблицы с полем "один-к-одному" и заполняемым полем CharField имени команды, но добавление поля ForeignKey вызывает сбой миграции со следующей ошибкой:
django.db.utils.ProgrammingError: column "index" referenced in foreign key constraint does not exist
Первичный ключ в TeamDim - team_id
и он соответствующим образом указан в определении модели, поэтому я не уверен, откуда взялась ссылка на столбец index
в ограничении внешнего ключа, которое пытается применить мигратор. Другие неуправляемые модели в моем приложении без проблем ссылаются на TeamDim через внешние ключи с тем же объявлением, поэтому я не уверен, почему это происходит в управляемом случае. Добавление kwargs db_index=False
или to_field='team_id'
к объявлению ForeignKey не устраняет проблему.
Ниже представлены две соответствующие модели - TeamDim и CefhUser
from django.db import models
from django.contrib.auth.models import User
# our managed dimension with primary key team_id
class TeamDim(models.Model):
def __str__(self):
return f'{str(self.team_id)}: {self.team_owner}/{self.team_shortname}'
team_id = models.BigIntegerField(primary_key=True)
team_owner = models.TextField(blank=True, null=True, verbose_name='Owner')
owner_formatted = models.TextField(blank=True, null=True, verbose_name='Owner')
team_shortname = models.TextField(blank=True, null=True, verbose_name='Team')
team_fullname = models.TextField(blank=True, null=True, verbose_name='Team')
class Meta:
managed = False
db_table = 'team_dim'
class CefhUser(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
# no problems here, migration is successful
team_shortname = models.CharField(max_length=32, null=True, blank=True)
# but adding this field causes failure during migration
team = models.ForeignKey('TeamDim', models.DO_NOTHING, blank=True, null=True)
... и сгенерированный скрипт миграции:
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('cefh_hub_app', '0008_cefhuser'),
]
operations = [
migrations.AddField(
model_name='cefhuser',
name='team',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='cefh_hub_app.teamdim'),
),
]