2015-10-07 1 views
5

я просто с помощью простой команды питона manage.py makemigrationsВы пытаетесь добавить ненулевое поле «идентификатор» в contact_info без умолчанию

Однако, все это я получаю эту ошибку:

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 

Вот models.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) 
+0

Вы прочитали ошибку? Это очень специфично. Что насчет этого смущает? –

+0

Это специфично, но я не знаю, как исправить это или поместить значения в db. – shashank

+3

У вас есть другой набор полей в качестве первичного ключа раньше? Я удивлен, что миграция пытается добавить поле id. – Alasdair

ответ

3

вы можете установить `default =" ", а также editable = False.

Факс .: first_name = models.CharField(max_length=50, default="", editable=False).

Добавление поля id не требуется. Django добавит его автоматически.

Редактировать: удаление последних файлов миграции в вашей папке миграции и повторная попытка повтора. Если это не сработает, повторите тот же процесс, вы узнаете, что вы удалили нужный файл, когда ваша команда «makemigrations» работает.

+0

Я не добавил поле id. Я хочу перенести эту модель в базу данных, но она показывает сообщение, которое я не знаю, как пройти через это. – shashank

+0

Запустили ли вы команду syncdb? Запустите python manage.py makemigrations yourapp после запуска python manage.py syncdb – pycod333

+0

yup, это показывает: Переходов не требуется. Ваши модели имеют изменения, которые еще не отражены в миграции, и поэтому не будут применяться. Запустите «manage.py makemigrations», чтобы выполнить новые миграции, а затем перезапустите «manage.py migrate», чтобы применить их. – shashank

0

Это происходит потому, что у вас есть не пустая база данных. Должна быть строка, которая не была создана через Django ORM.

Выполните следующие действия: питон manage.py оболочки

from <path_to_your_models> import * 
print len(list(contact_info.objects.filter(id = None))) 

Таким образом, вы узнать, сколько таких строк есть. Если вы хотите сохранить их, просто создайте сценарий миграции с некоторой ценностью, которую вы ему дадите.

+0

Я использовал оболочку и попытался добавить в нее значения, но он показывает: >>> p1 = contact_number (contact_numbers = '12345678') >>> p1.save() IntegrityError: myapp_contact_number.contact_id_id не может быть NULL Как я Romove Джанго идентификатор по умолчанию или myapp_contact_number.contact_id_id доступа – shashank

1

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

field_eg = models.CharField(default="") 

означает:

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

спасибо, я попробую это – shashank

14

Это происходит, когда другое поле было помечено как первичный ключ с primary_key=True ранее, и вы удаляете, что (в случае которого Джанго пытается добавить id первичный ключ).

Это django запрашивает значение по умолчанию для первичного ключа, кажется, является ошибкой.

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

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

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

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

4) Миграция, как обычно.

+3

Да, это проблема и решение, это действительно ошибка, похоже, одобренное решение не так. – Brambor

+0

@mehmet Отлично! Это обходное решение помогло мне двигаться вперед, наконец, после многих других вещей. Кажется, что это ошибка (https://code.djangoproject.com/ticket/22997). Но, к сожалению, еще одна ошибка (https://code.djangoproject.com/ticket/24030#comment:9) была обнародована после выполнения вышеуказанного. Мне пришлось полностью удалить db и перезапустить все миграции, чтобы иметь возможность использовать по умолчанию 'id' в качестве первичного ключа. – Anupam

0

У меня возникла аналогичная проблема при выполнении makemigration. У меня был первичный ключ с именем «Identity» и другими полями в моих моделях, к которым я применил makemigrations. Позже я изменил имя первичного ключа на «_id», и я получил эту ошибку.

You are trying to add a non-nullable field '_id' to swapidentity without a default; we can't do that (the database needs something to populate existing rows).

Ошибка немного вводит в заблуждение, но если вы меняете назад «_id» к «идентичности» вы не получите эту ошибку.

Как исправить? Удалить сценарий миграции, сгенерированный в пакете миграции. Или вручную измените первичный ключ в сгенерированном сценарии миграции.

Смежные вопросы