Невозможно указать внешний ключ в управляемой модели для неуправляемой модели (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'),
        ),
    ]
Вернуться на верх