如何解决 Django 中的以下错误:“OperationalError:外键不匹配”

Posted

技术标签:

【中文标题】如何解决 Django 中的以下错误:“OperationalError:外键不匹配”【英文标题】:How do I resolve the following error in Django: "OperationalError: foreign key mismatch" 【发布时间】:2021-10-02 19:34:26 【问题描述】:

每当我尝试保存到 SQLite 数据库中的表时,都会收到以下错误:

外键不匹配 - “procedure_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')

用于正确写入/更新 ProcedureTbl 表函数的原始 SQLite 命令。

如果我从 ProcedureTbl 中删除了 filename_id,则可以将数据保存到表中:

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

【问题讨论】:

你能说明你是如何“保存到桌子上”的吗 【参考方案1】:

这更像是一种解决方法。

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

创建别名后,“外键不匹配”错误消失了:

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']

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

Why does referencing a SQLite rowid cause foreign key mismatch?

Why can't you use SQLite ROWID as a Primary key?

感谢大家的时间。

【讨论】:

以上是关于如何解决 Django 中的以下错误:“OperationalError:外键不匹配”的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 Django 中的“请求设置 INSTALLED_APPS,但未配置设置。”错误?

django中的Slug字段错误

设置 debug = False 会使 Django 应用程序崩溃并出现以下错误,如何解决?

django中的csrf错误

仅在 Opera 上的 ajax 发布请求上的 Django CSRF 失败

每当我尝试将我的 django 应用程序推送到 Heroku 时,我的日志文件中都会出现以下错误,请协助我应该如何解决它,