Вы пытаетесь добавить недействительное поле '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 запрашивает значение по умолчанию для первичного ключа, кажется ошибкой.

Чтобы обойти эту проблему, выполните следующие действия:

  1. Укажите случайное значение по умолчанию при запросе во время makemigrations.

  2. Перейдите к созданному файлу миграции (в разделе your_app\migrations\ и удалите default=x,, где x - это случайное значение, которое вы указали в шаге 1.

  3. Пока вы находитесь в файле миграции, убедитесь, что порядок действий имеет смысл (например, удалите/измените один первичный ключ перед добавлением другого). Сохранить и закрыть.

  4. Мигрируй как обычно.

Ответ 3

Вам нужно установить значение по умолчанию. Например:

field_eg = models.CharField(default="")

означает:

name = models.CharField(max_length=100, default="")

Ответ 4

По-моему, полное уничтожение миграций - ленивая и плохая идея. Я сделал snafu, подобный @Afiz Momin, и смог выкопать себя.

У меня была следующая настройка:

  1. Базовая абстрактная модель.
  2. Переопределить поле id после создания (плохая идея)
  3. Все другие подклассы инициировали миграции 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, но это было явно неустойчиво. Но по прихоти я сделал следующее:

  1. Резервное копирование каталога migrations.orig в migrations.orig.
  2. Запустите ./manage.py makemigrations чтобы выполнить все миграции.
  3. Проверьте новый файл миграции 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>),
    ),
  1. Теперь вернитесь к migrations.orig и найдите миграцию, где сначала создается модель. Линия миграции будет похожа на приведенную выше.
  2. Когда вы найдете строку в migrations.orig, измените ее, чтобы она соответствовала новому коду миграции.
  3. Восстановите исходные миграции. Удалите migrations и переименуйте migrations.orig в migrations.
  4. Просто для хорошей меры запустите ./manage.py makemigrations и ./manage.py migrate. Вы больше не должны получать сообщений об ошибках!
  5. Если он жалуется на другую модель, выполните описанную процедуру.

Ответ 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>