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 对象。
我已经使用 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 对象。