Django запрос значения по умолчанию во время миграции - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть следующие модели:

    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, но в классе MethodStep я получаю сообщение об ошибке:

Вы пытаетесь добавить необнуляемое поле 'Methods_recipe' к методу шага без значения по умолчанию; мы не можем этого сделать (базе данных нужно что-то для заполнения существующих строк).

Может кто-нибудь мне помочь? Я не уверен, что отличается в каждом из этих классов, что означает, что MethodStep имеет ошибку, но Ingredient нет.

Редактировать: я также попытался удалить / очистить / удалить БД но ошибка сохраняется при каждом запуске makemigrations.

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

Иногда в дополнение к сбросу базы данных вам также придется удалить все существующие миграции из вашего проекта (или, по крайней мере, те, которые относятся к пакету, к которому относятся эти модели).

Удалите все файлы в папке миграций, КРОМЕ для файла _init__.py.

При простом сбрасывании базы данных и перезапуске django при запуске будет применяться история миграции в том порядке, в котором они были созданы. .

Это означает, что если вы добавили это поле ForeignKey после того, как уже перенесли изменения в базу данных, django не позволит вам мигрировать без значения по умолчанию, если вы не удалите историю миграции.

1 голос
/ 13 апреля 2020

Это происходит после создания поля модели.

Это потому, что вы добавили строки / объекты в таблицу / модель с момента последней миграции.

Django знает о строках таблицы в вашей базе данных и не может понять, чем заполнить новое поле для старых строк. Чтобы исправить это, в зависимости от типа созданного вами поля, обновите поле, добавив: default = None : если вы не возражаете против тех полей, которые не имеют ничего общего с go, в противном случае рассмотрите некоторую строку по умолчанию или int или float в соответствии с полем, идущим вперед, а также добавьте blank = True

Чтобы вернуть все на круги своя, кроме удаления вашей базы данных, вам также потребуется удалить связанные файлы миграции , Если вы не уверены, что это, удалите их все, но не трогайте файл init в папке. Затем сделайте миграцию и мигрируйте.

PS: я уверен, что вы знаете, что при последнем подходе вы потеряете все записи в модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...