如何解决 Django 中的以下错误:"OperationalError: foreign key mismatch"



当我试图保存到SQLite数据库中的表时,我得到以下错误:

外键不匹配- " procere_tbl"引用"filename_tbl">

在models.py中,这些是错误引用的表:

class FilenameTbl(models.Model):
rowid = models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='FileID', db_column='rowid')
filename = models.TextField(blank=True, null=True)
creation_datetime = models.TextField(blank=True, null=True)
class Meta:
managed = False
db_table = 'filename_tbl'
ordering = ['rowid']

class ProcedureTbl(models.Model):
rowid = models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ProcedureID', db_column='rowid')
...
filename_id = models.ForeignKey(FilenameTbl,db_column='filename_id', to_field='rowid',null=True,blank=True,on_delete=models.SET_NULL)
class Meta:
managed = False
db_table = 'procedure_tbl'
ordering = ['rowid']

可以像下面这样从表和查询集中读取数据,返回正确的数据:

queryset = FilenameTbl.objects.values(
'rowid', 'filename',
'proceduretbl__rowid')

原始SQLite命令写入/更新到ProcedureTbl表功能。

如果我从ProcedureTbl中删除filename_id,那么数据可以保存到表中:

queryset = ProcedureTbl.objects.get(procedure_number=10)
queryset.reviewer_comments='can save this'
queryset.save()

这更像是一种变通。

在创建表时,我没有为ROWID创建别名,只是将ROWID引用为主键。这对RAW SQLite命令工作得很好,但似乎Django不能很好地处理ROWID。

创建别名后,"外键不匹配";Error went away:

class FilenameTbl(models.Model):
filename = models.TextField(blank=True, null=True)
creation_datetime = models.TextField(blank=True, null=True)
filename_number = models.AutoField(primary_key=True, db_column='filename_number')
class Meta:
managed = False
db_table = 'filename_tbl'
ordering = ['filename_number']
# new ProcedureTbl
class ProcedureTbl(models.Model):
...
filename_id = models.ForeignKey(FilenameTbl,db_column='filename_id',null=True,blank=True,on_delete=models.SET_NULL)
procedure_number = models.AutoField(primary_key=True, db_column='procedure_number')
class Meta:
managed = False
db_table = 'procedure_tbl'
ordering = ['procedure_number']

读了这些文章后,我有了创建别名的想法

为什么引用一个SQLite行会导致外键不匹配?

为什么不能使用SQLite ROWID作为主键?

谢谢大家的时间。

相关内容

  • 没有找到相关文章

最新更新