当我试图保存到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作为主键?
谢谢大家的时间。