Ошибка 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 является столбцом, который создает некоторую проблему.
Вот еще немного контекста о том, как выглядит таблица в базе данных:

Удаление '_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 вернет объект.