[英]default value as callable is only called once during django migration
[英]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.