Django инструмент makemigrations не работает, если я изменяю внешний ключ / другие отношения в моделях - PullRequest
0 голосов
/ 30 марта 2020

У меня проблема с Djang makemigrations / migrate tool

  1. У меня есть модель снятия с Foreignkey для таблицы Employee. Все отлично работает

models.py

from django.contrib.auth.models import User

class Withdraw(models.Model):
    employee_id = models.ForeignKey(Employee, on_delete = models.PROTECT)
    amount = models.IntegerField(default=0)
    withdraw_date = models.DateTimeField(default=timezone.now)
    is_confirmed_by_employer = models.BooleanField(default=False)

Я хочу изменить его и добавить пользователя в качестве иностранного ключа для пользователя:

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

Я запускаю makemigrations и у меня появляется следующее сообщение об ошибке:

Вы пытаетесь добавить необнуляемое поле 'user' для удаления без значения по умолчанию; мы не можем этого сделать (базе данных нужно что-то для заполнения существующих строк). Пожалуйста, выберите исправление: 1) Укажите одноразовое значение по умолчанию сейчас (будет установлено для всех существующих строк с нулевым значением для этого столбца) 2) Выйдите и позвольте мне добавить значение по умолчанию в models.py

Если я нажму 1, то у меня появится следующее сообщение, что я на самом деле не получаю, зачем мне ставить пользователю datetime или timezone.now ??

Выберите опцию: 1 Пожалуйста, введите значение по умолчанию сейчас, как действительные Python Доступны модули datetime и django .utils.timezone, так что вы можете сделать, например, timezone.now Введите 'exit' для выхода из этого приглашения

Я пытался удалить папку migrates и заново создать файлы миграции, как советовали в некоторых других сообщениях на форуме. Когда я воссоздаю миграцию с помощью команды createmigrations Withdraw и переносу ее в postgresSql, таблица вывода не создается, но инструмент пишет, что таблица создана и перенесена.

Так или иначе Я не могу перенести это небольшое изменение в БД. Есть ли у вас мнения? Thx!

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Да, это естественное поведение.

Здесь произошло следующее: когда вы сначала создали другие строки в базе данных (раньше, до создания поля пользователя), пользовательского поля там не было, а теперь, когда вы добавляете поле пользователя в этой базе данных вы не устанавливаете ее в null или пусто, поэтому Django спрашивает: «А как насчет предыдущих сохраненных строк? Они не могут быть нулевыми». Поэтому лучшим вариантом было заполнить эти поля, указав одно значение по умолчанию. Чтобы сделать это, вам нужно было выбрать вариант 1, а затем заполнить эти пропущенные пробелы.

Я не рекомендую ответ, заданный @jTiKey, так как если вы разрешите поле пользователя быть пустым или пустым, пользователь может отказаться, не указав в поле «Пользователи». поле, и я думаю, вы этого не захотите.

1 голос
/ 30 марта 2020

Не добавляя значение по умолчанию или не делая поле пустым, требуется заполнить все ваши существующие записи. Вы можете просто сделать поле пустым.

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

или на шаге 4 вы можете просто ввести любой существующий идентификатор пользователя. (1 будет вашей первой учетной записью, созданной, если вы ее не удалите.)

...