簡體   English   中英

當我嘗試添加新對象時,為什么會出現錯誤?

[英]Why do I get an error when I try to add a new object?

我在模型中添加了一個名為user的外鍵字段,但我最初收到一條錯誤消息:

It is impossible to add a non-nullable field 'user' to bid without specifying a default.

所以我將字符串設為默認值'user' 但是,相反,我收到了錯誤:

ValueError: invalid literal for int() with base 10: 'user'當我嘗試migrate我所做的更改時( python3 manage.py migrate )。

當我嘗試添加新出價時,網頁中出現錯誤: OperationalError: no such column: auctions_listing.user_id

我該如何解決?

模型.py:

class Bid(models.Model):
    item = models.ForeignKey(Listing, on_delete=models.CASCADE)
    price = models.FloatField()
    user = models.ForeignKey(User, on_delete=models.CASCADE)

您收到錯誤的根本原因是您向IntegerField提供了一個字符串。

您遇到問題的真正原因是因為您嘗試使用新的不可空字段運行遷移,而沒有為 Django 提供合適的默認值。

當您運行遷移時,Django 需要在現有對象上填充新字段,因為它不能輸入 null。 它可能會在終端中詢問您是否要提供默認值 - 當它想要的是 user_id 整數(1、2、3 等)時,您輸入了“用戶”。

這可能不是您想要的選項,因為您最終會將所有現有項目分配給一個特定用戶。 您的解決方法是:

  1. 刪除您嘗試應用的遷移
  2. 允許該字段在您的代碼中可以為空
  3. 重新運行遷移
  4. 將所需用戶分配給每個現有對象
  5. 從字段中刪除null=True
  6. 運行另一個遷移

如果臨時為特定用戶分配所有對象並不重要,那么您可以跳過可為空的步驟,並在詢問時傳遞默認 ID,並在遷移運行后更改它們。 如果它會影響您的應用程序的當前用戶,您可能不想這樣做。

第一個錯誤:

如果不指定默認值,就不可能將不可為空的字段“用戶”添加到出價中。

您遇到此錯誤是因為您的數據庫中已經有一些記錄並且它們沒有這個新字段/列“用戶”,所以當您嘗試將“用戶”字段添加到該表而沒有null=Ture時,有些東西喜歡:

user = models.ForeignKey(User, null=True, Blank=True, on_delete=models.CASCADE)

舊記錄會怎樣? 因為他們還沒有該列,並且您沒有將該新字段/列作為不需要的字段/列提供,因此您應該在遷移流程中為舊記錄提供默認值。

第二個錯誤:

ValueError: int() 以 10 為底的無效文字:'user

默認情況下,Django ORM 對表的 id/pk 字段使用整數類型,因此當您在表中創建外鍵時,因為它引用整數字段,所以它應該是與 id/pk 相同的整數,(您可以設置如果需要,可以為 Django 表中的外鍵自定義類型)因為您為現有記錄提供了一個默認字符串,所以您在表中輸入了損壞的數據

第三個錯誤:

OperationalError:沒有這樣的列:auctions_listing.user_id

發生這種情況是因為您的遷移流程面臨問題並且 Django 無法為您的表創建新遷移

您應該怎么做:如果存在的數據對您不重要:

  1. 截斷你的數據庫/表
  2. 刪除您的應用遷移
  3. 再次創建遷移

別的:

  1. 找到為它們創建錯誤默認值的現有行
  2. 使用現有用戶 ID(整數值)更新它們,或在引用目標用戶的模型字段中添加默認整數值,例如

user = models.ForeignKey(User, default=1, on_delete=models.CASCADE)

暫無
暫無

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

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