簡體   English   中英

Django 中的 OnetoOne (primary_key=Tue) 到 ForeignKey

[英]OnetoOne (primary_key=Tue) to ForeignKey in Django

我在 model 中有一個具有 primary_key=True 的 OnetoOne 字段。 現在我想將其更改為 ForeignKey 但不能因為沒有“id”。

由此:

用戶 = models.OneToOneField(用戶,primary_key=True,on_delete=models.CASCADE)

對此:

user1 = models.ForeignKey(User, related_name='questionnaire', on_delete=models.CASCADE)

在進行遷移時顯示此內容:

您正在嘗試在沒有默認值的情況下向historyuserquestionnaire 添加不可為空的字段“id”; 我們不能這樣做(數據庫需要一些東西來填充現有的行)。 請 select 修復:1)現在提供一次性默認值(將在所有現有行上設置此列的 null 值)2)退出,讓我在 models.py 中添加默認值

那么該怎么做呢? 謝謝!

問題是您試圖刪除主鍵,但 Django 然后將添加一個名為“id”的新主鍵。 這是不可為空且唯一的,因此您不能真正提供一次性默認值。

最簡單的解決方案是創建一個新的 model 並在 SQL 遷移中復制您的表,使用舊的 user_id 填充 id 字段。 請務必重置您的表格順序以避免沖突。

只需刪除您以前的遷移

e.g 

    migrations:
          |
          |- 001.initail.py
          |- 002.examplefiles.py

你只需要刪除你最近的遷移和

運行命令

python3 manage.py makemigrations
python3 manage.py migrate

Django 型號具有默認ID屬性。 由於您更改了 model,因此以前的數據記錄現在與您的新列屬性沖突,因為在添加以前的記錄時,沒有 ForeignKey。 請記住,在您的外鍵中,不允許使用 null 值。 您的解決方案有多個修復程序。 一步一步地執行這些步驟,看看是什么解決了您的錯誤。

  • 刪除您的遷移文件並再次運行遷移

在你的外鍵中設置 NULL=True

或者

刪除表之前的記錄來解決沖突,這樣當你運行遷移時,它會添加一個默認值 id 本身

除了刪除之外,您還可以嘗試像這樣直接更改遷移文件

https://stackoverflow.com/a/29074241/11979793

暫無
暫無

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

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