Django 1.7-makemigrations не обнаруживает изменений


как говорится в названии, я не могу заставить миграции работать.

приложение изначально было под 1.6, поэтому я понимаю, что миграции не будут там изначально, и действительно, если я запустил python manage.py migrate Я:

Operations to perform:
  Synchronize unmigrated apps: myapp
  Apply all migrations: admin, contenttypes, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
  Installing custom SQL...
  Installing indexes...
Running migrations:
  No migrations to apply.

если я внесу изменения в любые модели в myapp, он по-прежнему говорит не мигрировал, как и ожидалось.

но если я сбегу python manage.py makemigrations myapp Я:

No changes detected in app 'myapp'

не важно, что или как я запускаю команду, она никогда не обнаруживать приложения как изменения, а также добавление каких-либо файлов миграции в приложение.

есть ли способ заставить приложение на миграции и по существу сказать: "Это моя база для работы" или что-нибудь еще? Или я что-то упустил?

моя база данных является PostgreSQL, если это вообще помогает.

23 122

23 ответа:

Если вы переходите от существующего приложения, которое вы сделали в django 1.6, то вам нужно сделать один предварительный шаг (как я узнал), указанный в документации:

python manage.py сделать эмиграцию your_app_label

документация не делает очевидным, что вам нужно добавить ярлык приложения в команду, так как первое, что он говорит вам сделать, это python manage.py makemigrations что не сумеет. Начальная миграция выполняется при создании приложения в версия 1.7, но если вы пришли из 1.6 не проводились. Смотрите 'добавление миграции в приложения' в документации для более подробной информации.

ОК, похоже, я пропустил очевидный шаг, но публикую это на случай, если кто-то еще сделает то же самое.

при обновлении до 1.7, мои модели стали неуправляемые (managed = False) - У меня они были как True раньше, но, кажется,он вернулся.

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

мое решение не было охвачено здесь, поэтому я публикую его. Я использовал syncdb для проекта–просто, чтобы получить его и работает. Затем, когда я попытался начать использовать миграции Django, он сначала подделал их, а затем сказал бы, что все в порядке, но с базой данных ничего не происходит.

мое решение было просто удалить все файлы миграции для моего приложения, а также как записи базы данных для миграции приложения в django_migrations таблица.

тогда я просто сделал начальная миграция с помощью:

./manage.py makemigrations my_app

затем:

./manage.py migrate my_app

теперь я могу сделать миграции без проблем.

это может произойти по следующим причинам:

  1. вы не добавили приложение в INSTALLED_APPS в список settings.py (Вы должны добавить название или пунктирный путь к подклассу AppConfig в apps.py в папке приложения, в зависимости от версии django, которую вы используете). См. документацию: INSTALLED_APPS
  2. нет migrations внутри приложения. (Решение: просто создайте эту папку).
  3. нет __init__.py внутри migrations папка этих приложений. (Решение: просто создайте пустой файл с именем __init__.py)
  4. у тебя нет __init__.py файл в папке приложения. (Решение: просто создайте пустой файл с именем __init__.py)
  5. у тебя нет models.py в приложение
  6. ваш класс Python (должен быть моделью) в models.py не наследует django.db.models.Model
  7. у вас есть некоторая семантическая ошибка в определении моделей в models.py

Примечание: Распространенной ошибкой является добавление на . При клонировании из удаленного РЕПО, и/или __init__.py файлы будут отсутствовать в местных РЕПО. Это вызывает проблемы.

I предложите игнорировать файлы миграции, добавив следующие строки в .gitignore file

*/migrations/*
!*/migrations/__init__.py

согласен с @furins. Если все кажется в порядке, и все же эта проблема возникает, проверьте, есть ли какой-либо метод свойства с тем же названием, Что и атрибут, который вы пытаетесь добавить в класс модели.

  1. удалить метод с аналогичным названием в качестве атрибута, который вы добавляете.
  2. manage.py makemigrations my_app
  3. manage.py миграция my_app
  4. добавить методы обратно.

Это своего рода глупая ошибка, но наличие дополнительной запятой в конце строки объявления поля в классе модели делает строку не имеющей никакого эффекта.

это происходит, когда вы копируете вставить def. из миграции, которая сама определяется как массив.

хотя, возможно, это поможет кому-то :-)

ответ находится на этом столбе stackoverflow, по cdvv7788 миграции в Django 1.7

Если это первый раз, когда вы обновляете это приложение, вы должны использовать:

manage.py makemigrations myappname как только вы это сделаете, вы можете сделать:

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

У меня была точно такая же проблема, и все вышеперечисленное отлично работало.

я переместил свое приложение django в cloud9, и по какой-то причине я никогда не поймал начальную миграцию.

может быть, это поможет кому-то. Я использовал вложенное приложение. проект.appname и у меня на самом деле был проект и проект.имя приложения в INSTALLED_APPS. Удаление проекта из INSTALLED_APPS позволило обнаружить изменения.

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

  1. удалить изменения, которые вы хотите синхронизировать.
  2. выполнить python manage.py makemigrations app_label для первичной миграции.
  3. выполнить python manage.py migrate для создания таблиц перед внесением изменений.
  4. вставить изменения, которые вы удаляете на первом шаге.
  5. выполнить 2. и 3. лестница.

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

Я надеюсь, это поможет кому-то в будущем.

следующие работал для меня:

  1. добавить имя приложения settings.py
  2. использовать 'python manage.py сделать эмиграцию'
  3. использовать 'python manage.py migrate'

работал для меня: Python 3.4, Django 1.10

может быть, я слишком поздно но вы попробуйте есть migrations папка в вашем приложении с в нем?

вы хотите проверить settings.py на INSTALLED_APPS список и убедитесь, что все приложения с модели, перечисленные здесь.

под управлением makemigrations в папке проекта означает, что он будет искать, чтобы обновить все таблицы, связанные со всеми приложениями, включенными в settings.py для проекта. Как только вы включите его, makemigrations будет автоматически включать приложение (это экономит много работы, так что вам не придется запускать makemigrations app_name для каждого приложения в вашем/ - сайт проекта).

на всякий случай у вас есть определенное поле, которое не идентифицируется makemigrations: проверьте дважды, если у вас есть свойство с тем же именем.

пример:

field = django.db.models.CharField(max_length=10, default = '', blank=True, null=True)

# ... later

@property
def field(self):
    pass

свойство будет "перезаписывать" определение поля, поэтому изменения не будут идентифицироваться makemigrations

добавить этот ответ, потому что только этот метод помог мне.

Я удалил migrations папка run makemigrations и migrate.
Он все еще говорил:нет миграции для применения.

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

это в основном редактирование файла миграции вручную.
сделайте это, только если вы понимаете содержимое файла.

убедитесь, что ваша модель не abstract. Я действительно сделал эту ошибку, и это заняло некоторое время, поэтому я подумал, что отправлю его.

вы использовали schemamigration my_app --initial после переименования старой папки миграции? Попробовать его. Может работать. Если нет-попробуйте воссоздать базу данных и сделать syncdb+migrate. Это сработало для меня...

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

недавно я обновил Django с 1.6 до 1.8 и имел несколько приложений и миграций для них. Я использовал юг и schemamigrations для создания миграции в Django 1.6, которая отбрасывается в Django 1.8.

когда я добавил новые модели после обновления makemigrations команда не обнаружила никаких изменений. И тогда я попробовал решение, предложенное @drojf (1-й ответ), он работал нормально, но не смог применить поддельную первоначальную миграцию (python manage.py --fake-initial). Я делал это, так как мои таблицы (старые таблицы) уже были создан.

наконец-то это сработало для меня, удалили новые модели (или изменения модели) из models.py а затем пришлось удалить (или переименовать для резервного копирования безопасности) папку миграции всех приложений и запустить python manage.py makemigrations для всех приложений, а затем сделал python manage.py migrate --fake-initial. Это сработало как заклинание. После того, как начальная миграция создается для всех приложений и поддельные первоначальные мигрировали, а затем добавлены новые модели и последовал регулярный процесс makemigrations и перенести на это приложение. Изменения были обнаружены сейчас и все все прошло нормально.

Я просто подумал поделиться им здесь, Если кто-то сталкивается с той же проблемой (имея schemamigrations юг для своих приложений), это может помочь им :)

может быть, может помочь кому-то, у меня была та же проблема.

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

я следовал этим шагам:

  1. я .\manage.py makemigrations app
  2. выполнил .\manage.py migrate
  3. я стер обе таблицы моего models.py
  4. я стер все ссылки на мои таблицы из сериализатора и класса представления.
  5. я выполнил шаг 1 и 2.
  6. я получил свои изменения только в models.py
  7. я снова выполнил шаг 5.
  8. я восстановил все мои изменения.

если вы работаете с Pycharm, местная история очень полезна.

может быть, это поможет кому-то.

Я удалил мой models.py и ожидалось makemigrations создать DeleteModel заявления.

не забудьте удалить *.pyc файлы!

./manage makemigrations
./manage migrate

миграции отслеживают изменения в БД, поэтому, если вы переходите от неуправляемого к управляемому, вам нужно будет убедиться, что таблица базы данных youre обновлена относительно модели, с которой Вы имеете дело.

Если вы все еще находитесь в режиме dev, я лично решил удалить файлы миграции в моей IDE, а также в таблице django_migrations, относящейся к моей модели, и повторно выполнить приведенную выше команду.

помните: если у вас есть миграция, которая заканчивается на _001 в вашей IDE & _003 в вашей базе данных. Django будет видеть только, если у вас есть миграция, заканчивающаяся на _004 для обновления.

2 (миграция кода и БД) связаны и работают в тандеме.

удачи в кодировании.

добавил этот ответ, потому что ни один из других доступных выше не работал для меня.

в моем случае что-то еще более странное происходит ( Версия Django 1.7), в моем models.py у меня был "дополнительные" строка в конце моего файла (это была пустая строка) и когда я выполнил результат: "никаких изменений не обнаружила".

чтобы исправить это, я удалил этот "пустая строка" Это было в конце моего models.py файл и я снова запустил команду, все было исправлено и все изменения, внесенные в models.py были обнаружены!

добавление моего 2c, так как ни одно из этих решений не работало для меня, но это так...

Я только что бежал manage.py squashmigrations и удалил старые миграции (как файлы, так и строки в django.таблица базы данных миграций).

это оставило такую строку в последнем файле миграции:

replaces = [(b'my_app', '0006_auto_20170713_1735'), (b'my_app', '0007_auto_20170713_2003'), (b'my_app', '0008_auto_20170713_2004')]

это, по-видимому, смутило Джанго и вызвало странное поведение: running manage.py makemigrations my_app воссоздал бы начальную миграцию, как если бы ее не существовало. Удаление replaces... строка исправлена проблема!