it-swarm.com.ru

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, если это вообще помогает.

126
TyrantWave

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

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

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

25
TyrantWave

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

python manage.py makemigrations your_app_label

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

173
drojf

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

  1. Вы не добавили приложение в список INSTALLED_APPS в settings.py (Вы должны добавить имя app или пунктирный путь к подклассу 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

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

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

*/migrations/*
!*/migrations/__init__.py
26
Mohammed Shareef C

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

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

Затем я только что сделал начальную миграцию с:

./manage.py makemigrations my_app

с последующим:

./manage.py migrate my_app

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

18
Grant Eagon

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

  1. Удалите метод с именем, похожим на атрибут, который вы добавляете.
  2. manage.py makemigrations my_app
  3. manage.py перенести my_app
  4. Добавьте методы обратно.
15
Prashant Nair

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

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

Хотя, может быть, это кому-то поможет :-)

11
Iman Akbari

Может быть, я опоздал, но вы пытались добавить в приложение папку migrations с файлом __init__.py

8
rrrub

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

  1. Добавьте имя приложения в settings.py
  2. используйте 'python manage.py makemigrations'
  3. используйте 'python manage.py migrate'

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

7
Pranshu Gupta

Ответ на этот пост stackoverflow, cdvv7788 Миграции в Django 1.7

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

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

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

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

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

7
MicahT

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

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

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

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

6
Deniz Kaplan

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

6
jaywhy13

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

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

5
Sticky

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

пример:

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

# ... later

@property
def field(self):
    pass

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

4
furins

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

Я удалил папкуmigrationsrun makemigrations и migrate.
Он все еще сказал: Нет миграций для применения.

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

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

4
Jithin Pavithran

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

4
Mark

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

3
Alex Vidis

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

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

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

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

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

1
winter

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

1
PhoebeB

Недавно я обновил Django с 1.6 до 1.8, и у меня было мало приложений и миграций для них. Я использовал south и 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
RaghavHarpale
./manage makemigrations
./manage migrate

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

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

ПОМНИТЕ: если у вас есть миграция, которая заканчивается на _001 в ваших IDE и _003 в вашей базе данных. Django увидит, есть ли у вас миграция, заканчивающаяся _004, для чего-либо, что нужно обновить.

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

Удачного кодирования.

1
A H Bensiali

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

Я удалил свой models.py и ожидал, что makemigrations создаст операторы DeleteModel.

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

1
Sebastian Wagner

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

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

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

0
Huskie

У меня была такая же проблема Убедитесь, что все классы, которые вы определили в models.py, должны унаследовать класс models.Model.

class Product(models.Model):
    title = models.TextField()
    description = models.TextField()
    price = models.TextField()
0
Sonu Kumar