Ошибка Django Admin при ссылке на неправильный столбец в ForeignKey

Я установил отношения с помощью django ForeignKey против 2 неуправляемых таблиц следующим образом:

class Product(BaseModel):
    publish_name = models.CharField(unique=True, max_length=40)
    # this works:
    associated_country = models.ForeignKey('geonames.Countryinfo', models.DO_NOTHING, db_column='published_country', blank=True, null=True)
    # this doesn't:
    associated_continent = models.ForeignKey('geonames.Continentcodes', on_delete=models.DO_NOTHING, db_column='published_continent' blank=True, null=True)

    class Meta:
        managed = True
        db_table = 'product'

class Continentcodes(models.Model):
    code = models.CharField(max_length=2, primary_key=True, unique=True)
    name = models.TextField(blank=True, null=True)
    geoname_id = models.OneToOneField('Geoname', models.DO_NOTHING, blank=True, null=True, unique=True)

    class Meta:
        managed = False
        db_table = 'geoname_continentcodes'

class Countryinfo(models.Model):
    iso_alpha2 = models.CharField(primary_key=True, max_length=2)
    country = models.TextField(blank=True, null=True)
    geoname = models.ForeignKey('Geoname', models.DO_NOTHING, blank=True, null=True)
    neighbours = models.TextField(blank=True, null=True)

    class Meta:
        ordering = ['country']
        managed = False
        db_table = 'geoname_countryinfo'
        verbose_name_plural = 'Countries'

Я написал несколько модульных тестов, которые проходят для вставки и получения значений внешнего ключа для отношений Continentcodes и Countryinfo в модели Product, но когда я иду редактировать запись в интерфейсе администратора django, я вижу следующее:

Вышеуказанное исключение (колонка geoname_continentcodes.geoname_id_id does не существует LINE 1: ...ntcodes". "code", "geoname_continentcodes". "name", "geoname_c... ^ Подсказка: Возможно, вы хотели сослаться на столбец "geoname_continentcodes.geoname_id"

Похоже, что по какой-то причине он пытается сослаться на geoname_continentcodes.geoname_id_id. Я пробовал добавить to='code' в отношение ForeignKey, но, похоже, это ни на что не влияет.

Кроме того, отношения associated_country, кажется, работают нормально, если я закомментирую поле associated_continent. Столбец associated_continent является столбцом, который создает некоторую проблему.

Вот еще немного контекста о том, как выглядит таблица в базе данных: enter image description here

Удаление '_id' в качестве суффикса является исправлением. В данном случае замена geoname_id на geoname исправляет ситуацию. Почему? Я понятия не имею. Django делает что-то за кулисами, что мне не ясно. Вот обновленная модель:

class Continentcodes(models.Model):
    code = models.CharField(max_length=2, primary_key=True, unique=True)
    name = models.TextField(blank=True, null=True)
    # remove '_id' as the suffix here
    geoname = models.ForeignKey('Geoname', models.DO_NOTHING, blank=True, null=True, unique=True)

    class Meta:
        managed = False
        db_table = 'geoname_continentcodes'

Django добавляет _id в конец, чтобы отличить объект от столбца id в таблице, geoname_id вернет id таблицы, в то время как geoname вернет объект.

Вернуться на верх