簡體   English   中英

如何解決 Django 中的以下錯誤:“OperationalError:外鍵不匹配”

[英]How do I resolve the following error in Django: “OperationalError: foreign key mismatch”

每當我嘗試保存到 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()

這更像是一種解決方法。

在創建表時,我沒有為 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']

閱讀這些文章后,我有了創建別名的想法

為什么引用 SQLite rowid 會導致外鍵不匹配?

為什么不能使用 SQLite ROWID 作為主鍵?

謝謝大家的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM