Вы пытаетесь добавить недействительное поле 'id' к contact_info без дефолта
Я просто использую простую команду python manage.py makemigrations
Однако все, что я получаю, это ошибка:
You are trying to add a non-nullable field 'id' to contact_info without a default;
we can't do that (the database needs something to populate existing rows). Please select a fix:
1) Provide a one-off default now (will be set on all existing rows)
2) Quit, and let me add a default in models.py
Вот модели .py:
class Document(models.Model):
docfile = models.FileField(upload_to='documents/')
class contact_number(models.Model):
contact_numbers= models.CharField(max_length=13)
class contact_address(models.Model):
address = models.CharField(max_length=100)
city = models.CharField(max_length=50)
state = models.CharField(max_length=50)
zip = models.CharField(max_length=5)
class contact_info(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
email = models.EmailField()
contact_numbers=models.ManyToManyField(contact_number)
addresses=models.ManyToManyField(contact_address)
Ответы
Ответ 1
вы можете установить `default = "", а также editable = False.
Например, first_name = models.CharField(max_length=50, default="", editable=False)
.
Добавление поля id не требуется. Django добавит его автоматически.
Изменить: удаление последних файлов миграции в вашей папке миграции и повторная попытка повтора. Если это не сработает, повторите тот же процесс, вы узнаете, что удалили нужный файл, когда ваша команда "makemigrations" работает.
Ответ 2
Это происходит, когда другое поле было помечено как первичный ключ с помощью primary_key=True
ранее, и вы удаляете это (в случае, если django пытается добавить первичный ключ id
).
То, что Django запрашивает значение по умолчанию для первичного ключа, кажется ошибкой.
Чтобы обойти эту проблему, выполните следующие действия:
Укажите случайное значение по умолчанию при запросе во время makemigrations.
Перейдите к созданному файлу миграции (в разделе your_app\migrations\
и удалите default=x,
, где x - это случайное значение, которое вы указали в шаге 1.
Пока вы находитесь в файле миграции, убедитесь, что порядок действий имеет смысл (например, удалите/измените один первичный ключ перед добавлением другого). Сохранить и закрыть.
Мигрируй как обычно.
Ответ 3
Вам нужно установить значение по умолчанию. Например:
field_eg = models.CharField(default="")
означает:
name = models.CharField(max_length=100, default="")
Ответ 4
По-моему, полное уничтожение миграций - ленивая и плохая идея. Я сделал snafu, подобный @Afiz Momin, и смог выкопать себя.
У меня была следующая настройка:
- Базовая абстрактная модель.
- Переопределить поле
id
после создания (плохая идея) - Все другие подклассы инициировали миграции Django, чтобы попытаться создать поле ID из родительского класса.
Поэтому я получал следующее за каждый раз, когда я запускал makemigrations
:
You are trying to add a non-nullable field 'id' to <tablename> without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit, and let me add a default in models.py
Но был выход.
В моей первой попытке я просто запустил поддельное значение, а затем удалил созданный столбец id
, но это было явно неустойчиво. Но по прихоти я сделал следующее:
- Резервное копирование каталога
migrations.orig
в migrations.orig
. - Запустите
./manage.py makemigrations
чтобы выполнить все миграции. - Проверьте новый файл миграции
0001-initial
.
Скорее всего, модель, на которую она жалуется (<tablename>
), не содержит жизненно важной информации. Для меня отсутствовал аргумент bases
:
migrations.CreateModel(
name='<ModelName>',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('some_field', models.IntegerField()),
# ... other fields ...
],
options={
'abstract': False,
},
bases=(<base_classes>),
),
- Теперь вернитесь к
migrations.orig
и найдите миграцию, где сначала создается модель. Линия миграции будет похожа на приведенную выше. - Когда вы найдете строку в
migrations.orig
, измените ее, чтобы она соответствовала новому коду миграции. - Восстановите исходные миграции. Удалите
migrations
и переименуйте migrations.orig
в migrations
. - Просто для хорошей меры запустите
./manage.py makemigrations
и ./manage.py migrate
. Вы больше не должны получать сообщений об ошибках! - Если он жалуется на другую модель, выполните описанную процедуру.
Ответ 5
Это происходит потому, что у вас есть непустая база данных. Должна быть строка, которая не была создана через Django ORM.
Сделайте следующее:
оболочка python manage.py
from <path_to_your_models> import *
print len(list(contact_info.objects.filter(id = None)))
Таким образом вы узнаете, сколько таких строк есть. Если вы хотите сохранить их, просто выполните миграцию script с некоторым значением, которое вы ему дадите.
Ответ 6
У меня возникла аналогичная проблема при выполнении makemigration. У меня был первичный ключ с именем "Identity" и другими полями в моих моделях, к которым я применил makemigrations. Позже я изменил имя первичного ключа на "_id" , и я получил эту ошибку.
Вы пытаетесь добавить поле "_id" , отличное от нуля, для обмена данными без дефолта; мы не можем этого сделать (базе данных необходимо что-то заполнить существующие строки).
Ошибка вводит в заблуждение, но если вы измените "_id" на "Identity", вы не получите эту ошибку.
Как исправить?
Удалить миграцию script, сгенерированную в пакете миграции. Или вручную измените первичный ключ в вашей сгенерированной миграции script.
Ответ 7
Это также может произойти, если вы внесли некоторые изменения в свои модели.py и попытались выполнить миграцию впоследствии. Случилось со мной однажды. В конце концов, удаление всей базы данных не помогло. В случае возникновения ошибки после добавления внешнего ключа вы не можете указать значение по умолчанию, или может быть небезопасно устанавливать значение по умолчанию как null.
Вероятно, у Django все еще есть некоторые из предыдущих файлов миграции в вашей папке myapp/migrations/. Это может помочь удаление этих файлов.
Ответ 8
Проверьте свои файлы миграции
./manage.py showmigrations <App Name>
[X] 0001_initial
[X] 0002_auto_20181204_1110
Восстановить миграцию
./manage.py migrate <App Name> <migration file name>
например: 0001_initial или использовать ноль (для полной миграции)
Проверьте свои миграции
./manage.py showmigrations <App Name>
[] 0001_initial
[] 0002_auto_20181204_1110
Теперь удалите все возвращаемые миграции и снова выполните миграцию.
./manage.py migrate <App Name>