InvalidCursorName:Django 管理错误引用外键中的错误列

InvalidCursorName : Django Admin error referencing wrong column in ForeignKey

我已经使用 django 的 ForeignKey 与 2 个非托管 table 建立了关系,如下所示:

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.ForeignKey('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'

当我在 django 管理页面中为 'Products' 编辑一个条目时,我看到了这个:

InvalidCursorName at /admin/product/6/change/ cursor "_django_curs_140162796078848_sync_5" does not exist

The above exception (column geoname_continentcodes.geoname_id_id does not exist LINE 1: ...ntcodes"."code", "geoname_continentcodes"."name", "geoname_c... ^ HINT: Perhaps you meant to reference the column "geoname_continentcodes.geoname_id"

它似乎出于某种原因试图引用 geoname_continentcodes.geoname_id_id。我试过在 ForeignKey 关系中添加 to='code',但它似乎没有任何影响。

此外,如果我注释掉 associated_continent 字段,associated_country 关系似乎工作得很好。 associated_continent 是出现问题的列。

以下是关于 table 在数据库中的更多信息:

删除后缀“_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 以区分 table 中的对象和 id 列,geoname_id 将 return table id,而 geoname 将return 对象。