簡體   English   中英

Django 在遷移期間要求默認值

[英]Django asking for default value during migration

我有以下型號:

    title = models.CharField(max_length=100)
    description = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'pk': self.pk})


class Ingredient(models.Model):
    ingredients_recipe = models.ForeignKey(Post, on_delete=models.CASCADE)
    type = models.CharField(max_length=50)
    quantity = models.IntegerField()
    measurement = models.CharField(max_length=50)


class MethodStep(models.Model):
    methods_recipe = models.ForeignKey(Post, on_delete=models.CASCADE, null=True)
    step = models.TextField()

當我嘗試運行makemigrations時,我沒有收到Ingredient class 的錯誤,但在MethodStep class 上我收到錯誤消息:

您正在嘗試將不可為空的字段“methods_recipe”添加到沒有默認值的方法步驟; 我們不能這樣做(數據庫需要一些東西來填充現有的行)。

有人能幫我嗎? 我不確定這些類中的每一個有什么不同,這意味着MethodStep有錯誤,但Ingredient沒有。

編輯:我也嘗試過刪除/清除/刪除數據庫,但每次運行makemigrations時錯誤仍然存在。

有時除了重置數據庫之外,您還必須從項目中刪除所有現有的遷移(或者至少是這些模型所屬的 package 的遷移)。

刪除遷移文件夾中的所有文件,除了 _init__.py 文件。

當簡單地轉儲您的數據庫並重新啟動 django 時,啟動將按照創建順序應用遷移歷史記錄。

這意味着如果您在將更改遷移到數據庫之后添加了此 ForeignKey 字段,則 django 不會讓您在沒有默認值的情況下進行遷移,除非您刪除遷移歷史記錄。

這發生在您創建 model 字段之后。

這是因為自上次遷移以來,您在表/模型中添加了行/對象。

Django 知道數據庫中的表行,並且無法弄清楚為舊行填充新字段的內容。 要解決此問題,根據您新創建的字段類型,更新字段添加: default=None :如果您不介意那些與 go 無關的字段,否則考慮一些默認字符串或 int 或 float 與該字段一致向前 AND 還添加空白 = True

要將一切恢復原狀,除了刪除數據庫之外,您還需要刪除相關的遷移文件。 如果您不確定它是哪個,請將它們全部刪除,但不要觸摸文件夾中的init文件。 然后進行遷移和遷移。

PS:我確定您知道使用最后一種方法會丟失 model 中的所有記錄。

暫無
暫無

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

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