Django 1.7 - makemigrations tidak mendeteksi perubahan

140

Seperti judulnya, sepertinya saya tidak bisa membuat migrasi berfungsi.

Aplikasi ini awalnya di bawah 1,6, jadi saya mengerti bahwa migrasi tidak akan ada di sana pada awalnya, dan memang jika saya menjalankan python manage.py migratesaya mendapatkan:

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.

Jika saya melakukan perubahan pada model apa pun myapp, masih dikatakan tidak bermigrasi, seperti yang diharapkan.

Tetapi jika saya menjalankan python manage.py makemigrations myappsaya mendapatkan:

No changes detected in app 'myapp'

Tampaknya tidak masalah apa atau bagaimana saya menjalankan perintah, itu tidak pernah mendeteksi aplikasi memiliki perubahan, juga tidak menambahkan file migrasi ke aplikasi.

Apakah ada cara untuk memaksa aplikasi ke migrasi dan pada dasarnya mengatakan "Ini basis saya untuk bekerja dengan" atau apa? Atau apakah saya melewatkan sesuatu?

Basis data saya adalah PostgreSQL jika itu membantu.

TyrantWave
sumber
Solusi yang ditawarkan tidak bekerja untuk saya jadi inilah solusi saya jika ada yang menghadapi masalah yang sama! 1. Hapus file migrasi di bawah semua aplikasi 2. Hapus database dan buat lagi 3. jalankan makemigrasi dan migrasi perintah PS Coba langkah 1 dan 3 terlebih dahulu. Jika masih ada kesalahan, lakukan langkah 1-3.
Amoroso

Jawaban:

187

Jika Anda mengubah dari aplikasi yang ada yang Anda buat di Django 1.6, maka Anda perlu melakukan satu pra-langkah (seperti yang saya ketahui) yang tercantum dalam dokumentasi:

python manage.py makemigrations your_app_label

Dokumentasi tidak menjelaskan bahwa Anda perlu menambahkan label aplikasi ke perintah, karena hal pertama yang diperintahkan untuk Anda lakukan adalah python manage.py makemigrationsyang akan gagal. Migrasi awal dilakukan ketika Anda membuat aplikasi di versi 1.7, tetapi jika Anda berasal dari 1.6, itu tidak akan dilakukan. Lihat 'Menambahkan migrasi ke aplikasi' dalam dokumentasi untuk detail lebih lanjut.

drojf
sumber
1
Jawaban yang bagus untuk orang-orang yang datang dari Django 1.6! Terima kasih!
David D.
1
Bagaimana jika saya memiliki lebih dari satu aplikasi? Haruskah saya melakukannya python manage.py makemigrations APP_LABELuntuk masing-masing?
Alston
1
Di bawah Django 1.9 di sini dan aplikasi saya dibuat dengan ./manage.py startapp, tapi saya masih harus menyebutkan labelnya secara eksplisit
maxbellec
50

Ini dapat terjadi karena alasan berikut:

  1. Anda tidak menambahkan aplikasi dalam INSTALLED_APPSdaftar di settings.py (Anda harus menambahkan nama aplikasi atau path bertitik ke subkelas AppConfig di apps.py di folder aplikasi, tergantung pada versi Django yang Anda gunakan). Rujuk dokumentasi: INSTALLED_APPS
  2. Anda tidak memiliki migrationsfolder di dalam aplikasi itu. (Solusi: cukup buat folder itu).
  3. Anda tidak memiliki __init__.pyfile di dalam migrationsfolder aplikasi tersebut. (Solusi: Cukup buat file kosong dengan nama __init__.py )
  4. Anda tidak memiliki __init__.pyfile di dalam folder aplikasi. (Solusi: Cukup buat file kosong dengan nama __init__.py )
  5. Anda tidak memiliki models.pyfile di aplikasi
  6. Kelas Python Anda (seharusnya menjadi model) di models.pytidak mewarisidjango.db.models.Model
  7. Anda memiliki beberapa kesalahan semantik dalam definisi model di models.py

Catatan: Kesalahan umum adalah menambahkan migrationsfolder dalam .gitignorefile. Ketika dikloning dari repo jarak jauh, migrationsfolder dan / atau __init__.pyfile akan hilang di repo lokal. Ini menyebabkan masalah.

Saya sarankan untuk gitignore file migrasi dengan menambahkan baris berikut ke .gitignorefile

*/migrations/*
!*/migrations/__init__.py
Mohammed Shareef C
sumber
1
Saya telah mengkloning proyek dan folder migrasi saya tidak didorong ke repo jadi saya harus menambahkan direktur migrasi kemudian saya menambahkan init .py dan saya dapat melakukan migrasi. Terima kasih kepada Anda
Junaid
Saya menghapus konten folder / migrasi saya untuk "mengatur ulang" hal-hal pada proyek yang belum saya sebarkan. Saya secara tidak sengaja menghapus __init__.pyfolder bersama dengan migrasi.
Seth
Ini berhasil untuk saya .... You don't have __init__.py file inside migrations folder of those apps. (Solution: Just create an empty file with name __init__.py).. dan itu disebabkan oleh penambahan file ke.gitignore
lukik
1
Mengapa file init .py sangat penting di folder migrasi? membuat migrasi? Di mana saya dapat menggali lebih dalam untuk logika ini?
Nimish Bansal
1
@NimishBansal Till python 3.3 __init__.pyfile diperlukan di dalam direktori untuk membuatnya diperlakukan sebagai paket python. lihat ini
Mohammed Shareef C
29

Ok, sepertinya saya melewatkan langkah yang jelas, tetapi memposting ini jika ada orang lain yang melakukan hal yang sama.

Ketika memutakhirkan ke 1.7, model saya menjadi tidak terkelola ( managed = False) - Saya memilikinya seperti Truesebelumnya tetapi sepertinya dikembalikan.

Menghapus garis itu (Ke default ke True) dan kemudian menjalankan makemigrationssegera membuat modul migrasi dan sekarang itu berfungsi. makemigrationstidak akan berfungsi pada tabel yang tidak dikelola (Yang jelas di belakang)

TyrantWave
sumber
4
Mohon klarifikasi - di mana Anda mengubah / menambahkan "berhasil = Salah"? Saya mengalami masalah yang sama
Ycon
1
Saya tidak memiliki kode itu lagi, tetapi saya pikir sebagai properti kelas jika saya ingat dengan benar.
TyrantWave
1
Poin yang bagus. Catatan yang manage.py inspectdbmenambahkan kelola = Salah! jika Anda mengimpor basis data lama, Anda harus hati-hati menyetelnya!
Alessandro Dentella
@ TyrantWave, Anda menyelamatkan hari saya. Terima kasih banyak.
Utkarsh Sharma
pastikan Anda app_labelsama
Luv33preet
19

Solusi saya tidak dibahas di sini jadi saya mempostingnya. Saya telah menggunakan syncdbuntuk sebuah proyek - hanya untuk menjalankan dan menjalankannya. Kemudian ketika saya mencoba untuk mulai menggunakan migrasi Django, itu memalsukan mereka pada awalnya kemudian akan mengatakan itu 'OK' tetapi tidak ada yang terjadi pada database.

Solusi saya adalah menghapus semua file migrasi untuk aplikasi saya, serta catatan basis data untuk migrasi aplikasi dalam django_migrationstabel.

Lalu saya baru saja melakukan migrasi awal dengan:

./manage.py makemigrations my_app

diikuti oleh:

./manage.py migrate my_app

Sekarang saya bisa melakukan migrasi tanpa masalah.

Grant Eagon
sumber
FYI: sangat penting bahwa ia mengatakan di sini, "file-file itu, serta catatan basis data." Jika Anda menghapus catatan basis data tetapi bukan file juga (kecuali untuk __init.py__, itu tidak akan berfungsi.
Mike Robinson
15

Setuju dengan @furins. Jika semuanya tampak berurutan namun masalah ini muncul, periksa apakah ada metode properti dengan judul yang sama dengan atribut yang Anda coba tambahkan di kelas Model.

  1. Hapus metode dengan nama yang mirip dengan atribut yang Anda tambahkan.
  2. manage.py makemigrations my_app
  3. kelola.py migrasi my_app
  4. Tambahkan metode kembali.
Prashant Nair
sumber
11

Ini semacam kesalahan bodoh untuk dibuat, tetapi memiliki koma ekstra di akhir baris deklarasi lapangan di kelas model, membuat garis tidak berpengaruh.

Ini terjadi ketika Anda menyalin tempel def. dari migrasi, yang dengan sendirinya didefinisikan sebagai array.

Meskipun mungkin ini akan membantu seseorang :-)

Iman Akbari
sumber
1
Komentar Anda membantu saya menemukan masalah saya! Saya tidak memiliki tanda koma di akhir pilihan terakhir dalam daftar pilihan..mungkin Django sangat sensitif.
Maxim
1
@ Maxim: itu tidak mungkin menjadi penyebab masalah Anda: daftar tanpa koma pada akhirnya masih berupa daftar. Masalah lainnya adalah tupel: jika Anda hanya memiliki 1 elemen dalam tupel, Anda perlu koma setelahnya.
blueFast
Bung yang menyelamatkan saya banyak waktu! @dononfast: dalam definisi Model, memang masalah.
MrE
11

Mungkin saya terlambat tetapi apakah Anda mencoba memiliki migrationsfolder di aplikasi Anda dengan __init__.pyfile di dalamnya?

rrrub
sumber
1
Jika Anda memiliki "makemigrations" ini akan membuat migrasi untuk aplikasi. Kalau tidak, Anda harus menjalankan appemame makemigrations (yang membuat file ini)
Scott Warren
7

Mungkin ini akan membantu seseorang. Saya menggunakan aplikasi bersarang. project.appname dan saya benar-benar memiliki project dan project.appname di INSTALLED_APPS. Menghapus proyek dari INSTALLED_APPS memungkinkan perubahan terdeteksi.

jaywhy13
sumber
7

Jawabannya ada pada posting stackoverflow ini, oleh cdvv7788 Migrasi di Django 1.7

Jika ini adalah pertama kalinya Anda memigrasikan aplikasi yang harus Anda gunakan:

manage.py makemigrations myappname Setelah Anda melakukannya, Anda dapat melakukannya:

manage.py migrasi Ubah model Anda kembali ke bentuk aslinya, jalankan perintah pertama (dengan nama aplikasi) dan migrasi ... itu akan berpura-pura. Setelah Anda melakukannya, kembalikan perubahan pada model Anda, jalankan migrasi besar dan bermigrasi lagi dan itu akan berhasil.

Saya mengalami masalah yang sama persis dan melakukan hal di atas bekerja dengan sempurna.

Saya telah memindahkan aplikasi Django saya ke cloud9 dan untuk beberapa alasan saya tidak pernah menangkap migrasi awal.

MicahT
sumber
7

Berikut ini bekerja untuk saya:

  1. Tambahkan nama aplikasi ke settings.py
  2. gunakan 'python manage.py makemigrations'
  3. gunakan 'python manage.py migrate'

Bekerja untuk saya: Python 3.4, Django 1.10

Pranshu Gupta
sumber
6

Orang-orang seperti saya yang tidak suka migrasi dapat menggunakan langkah-langkah di bawah ini.

  1. Hapus perubahan yang ingin Anda selaraskan.
  2. Jalankan python manage.py makemigrations app_labeluntuk migrasi awal.
  3. Jalankan python manage.py migrateuntuk membuat tabel sebelum Anda membuat perubahan.
  4. Rekatkan perubahan yang Anda hapus pada langkah pertama.
  5. Jalankan 2. dan 3. langkah-langkah.

Jika Anda salah satu dari langkah-langkah ini, baca file migrasi. Ubah mereka untuk memperbaiki skema Anda atau menghapus file yang tidak diinginkan tetapi jangan lupa untuk mengubah bagian dependensi file migrasi berikutnya;)

Saya harap ini akan membantu seseorang di masa depan.

Deniz Kaplan
sumber
5

Anda ingin memeriksa settings.pydalam INSTALLED_APPSdaftar dan pastikan semua aplikasi dengan model tercantum di sana.

Berjalan makemigrationsdi folder proyek berarti akan terlihat memperbarui semua tabel yang terkait dengan semua aplikasi yang termasuk dalam settings.pyuntuk proyek. Setelah Anda memasukkannya, makemigrationsakan secara otomatis memasukkan aplikasi (ini menghemat banyak pekerjaan sehingga Anda tidak harus menjalankan makemigrations app_nameuntuk setiap aplikasi di proyek / situs Anda).

Lengket
sumber
5

Untuk berjaga-jaga seandainya Anda memiliki bidang tertentu yang tidak dapat diidentifikasi oleh macemigrations: periksa dua kali jika Anda memiliki properti dengan nama yang sama.

contoh:

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

# ... later

@property
def field(self):
    pass

properti akan "menimpa" definisi bidang sehingga perubahan tidak akan diidentifikasi oleh makemigrations

Furins
sumber
Nyebelin terkait adalah memiliki bidang cacat yang masih lolos validasi / periksa. Saya mendefinisikan hourly_rate = models.DecimalField(melewatkan trailing '()') dan hanya gagal diam-diam.
bijak
5

Pastikan model Anda tidak abstract. Saya benar-benar membuat kesalahan itu dan butuh beberapa saat, jadi saya pikir saya akan mempostingnya.

Menandai
sumber
4

Menambahkan jawaban ini karena hanya metode ini yang membantu saya.

Saya menghapus migrationsfolder run makemigrationsdan migrate.
Ia masih berkata: Tidak ada migrasi untuk diterapkan.

Saya pergi ke migratefolder dan membuka file yang terakhir dibuat,
mengomentari migrasi yang saya inginkan (Terdeteksi dan masuk ke sana)
dan berjalan migratelagi.

Ini pada dasarnya mengedit file migrasi secara manual.
Lakukan ini hanya jika Anda memahami konten file.

Jithin Pavithran
sumber
1
Terima kasih banyak! Ini membantu
Sharpless512
3

Apakah Anda menggunakan schemamigration my_app --initialsetelah mengganti nama folder migrasi lama? Cobalah. Mungkin bekerja Jika tidak - coba buat ulang basis data dan buat syncdb + migrasi. Itu bekerja untuk saya ...

Alex Vidis
sumber
10
Tidak ada perintah schemamigration- saya pikir itu bagian dari Selatan? Saya tidak memiliki folder migrasi sama sekali saat ini. Menghapus saya models.pydan rerunning inspectdbsepertinya tidak melakukan apa-apa.
TyrantWave
2
schemamigrationberasal dari Selatan. makemigrationsadalah penggantinya.
Craig Labenz
2
Ini masih berlaku. Tetapi berubah menjadimakemigrations --empty
Iulius Curt
2

Punya masalah yang sama Pastikan kelas apa pun yang telah Anda tetapkan di models.py, Anda harus mewarisi model. Model kelas.

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

Saya memiliki masalah yang sama dengan harus menjalankan macemigrations dua kali dan segala macam perilaku aneh. Ternyata akar masalahnya adalah bahwa saya menggunakan fungsi untuk menetapkan tanggal default pada model saya sehingga migrasi mendeteksi perubahan setiap kali saya menjalankan migrasi. Jawaban atas pertanyaan ini menempatkan saya di jalur yang benar: Hindari makemigrasi untuk membuat ulang bidang tanggal

PhoebeB
sumber
1

Saya baru-baru ini meningkatkan Django dari 1,6 menjadi 1,8 dan memiliki beberapa aplikasi dan migrasi untuk mereka. Saya menggunakan selatan dan schemamigrationsuntuk membuat migrasi di Django 1.6, yang dijatuhkan di Django 1.8.

Ketika saya menambahkan model baru setelah peningkatan, makemigrationsperintah itu tidak mendeteksi perubahan apa pun. Dan kemudian saya mencoba solusi yang disarankan oleh @drojf (jawaban pertama), itu berfungsi dengan baik, tetapi gagal untuk menerapkan migrasi awal palsu ( python manage.py --fake-initial). Saya melakukan ini karena meja saya (tabel lama) sudah dibuat.

Akhirnya ini berhasil bagi saya, menghapus model-model baru (atau perubahan model) dari models.py dan kemudian harus menghapus (atau mengganti nama untuk cadangan keselamatan) folder migrasi semua aplikasi dan menjalankan manage.pymacemigrations python untuk semua aplikasi, kemudian lakukan python manage.py migrate --fake-initial. Ini bekerja seperti pesona. Setelah migrasi awal dibuat untuk semua aplikasi dan memalsukan awal migrasi, kemudian menambahkan model baru dan mengikuti proses reguler makemigrationsdan bermigrasi pada aplikasi itu. Perubahan terdeteksi sekarang dan semuanya berjalan dengan baik.

Saya hanya berpikir untuk membagikannya di sini, jika seseorang menghadapi masalah yang sama (memiliki schemamigrationsselatan untuk aplikasi mereka), itu mungkin membantu mereka :)

RaghavHarpale
sumber
1

Mungkin itu bisa membantu seseorang, saya punya masalah yang sama.

Saya sudah membuat dua tabel dengan kelas serializer dan pandangan. Jadi ketika saya ingin memperbarui, saya memiliki kesalahan ini.

Saya mengikuti langkah-langkah ini:

  1. saya membuat .\manage.py makemigrations app
  2. Saya dieksekusi .\manage.py migrate
  3. Saya menghapus kedua tabel saya models.py
  4. Saya menghapus semua referensi ke tabel saya dari serializer dan kelas tampilan.
  5. Saya menjalankan langkah 1dan 2.
  6. Saya mengambil perubahan saya hanya di models.py
  7. Saya jalankan lagi langkah 5.
  8. Saya memulihkan semua perubahan saya.

Jika Anda bekerja dengan Pycharm, sejarah lokal sangat membantu.

sidik jari
sumber
1

Mungkin ini akan membantu seseorang.

Saya telah menghapus models.pydan berharap makemigrationsuntuk membuat DeleteModelpernyataan.

Ingatlah untuk menghapus *.pycfile!

Sebastian Wagner
sumber
1
./manage makemigrations
./manage migrate

Migrasi melacak perubahan ke DB sehingga jika Anda berubah dari tidak terkelola menjadi terkelola, Anda harus memastikan bahwa tabel basis data Anda mutakhir terkait dengan Model yang Anda hadapi.

Jika Anda masih dalam mode dev, saya pribadi memutuskan untuk menghapus file migrasi di IDE saya dan juga di tabel django_migrations yang berkaitan dengan Model saya dan jalankan kembali perintah di atas.

INGAT: jika Anda memiliki migrasi yang diakhiri dengan _001 di IDE Anda & _003 di database Anda. Django hanya akan melihat apakah Anda memiliki migrasi yang diakhiri dengan _004 agar ada yang diperbarui.

2 (migrasi kode & db) ditautkan dan berfungsi bersama-sama.

Selamat coding.

AH Bensiali
sumber
1
  1. Hapus perubahan yang ingin Anda selaraskan.
  2. Jalankan python manage.py makemigrations app_label untuk migrasi awal.
  3. Jalankan python manage.py, migrasi untuk membuat tabel sebelum Anda membuat perubahan.
  4. Rekatkan perubahan yang Anda hapus pada langkah pertama.
  5. Jalankan 2. dan 3. langkah-langkah
Vijay Choudhary
sumber
0

Menambahkan jawaban ini karena tidak ada yang lain di atas yang berfungsi untuk saya.

Dalam kasus saya sesuatu yang lebih aneh sedang terjadi ( Versi Django 1.7 ), Dalam models.py saya, saya memiliki garis "ekstra" di akhir file saya (itu adalah baris kosong) dan ketika saya menjalankan python manage.py makemigrationsperintah hasilnya adalah: "tidak ada perubahan yang terdeteksi".

Untuk memperbaikinya saya menghapus "baris kosong" ini yang ada di akhir file models.py saya dan saya menjalankan perintah lagi, semuanya sudah diperbaiki dan semua perubahan yang dibuat untuk models.py terdeteksi!

Huskie
sumber
Nah di Django 2.0 + bahwa baris kosong diperlukan saya percaya, saya harus melakukan kebalikan dari apa yang Anda lakukan sobat
Sumit Kumar Saha
@SumitKumarSaha haha ​​Saya menggunakan versi Django 1.7 saat ini dan baris kosong itu adalah alasan 2 jam mencoba segalanya untuk menyelesaikan kesalahan migrasi. Terima kasih telah berbagi Sumit. Semoga harimu menyenangkan
Huskie
0

Anda mungkin perlu memalsukan migrasi awal menggunakan perintah di bawah ini

python manage.py migrate --fake-initial
dtar
sumber
0

Pertama, solusi ini berlaku untuk mereka yang menghadapi masalah yang sama selama penempatan di server heroku, saya menghadapi masalah yang sama.

Untuk menggunakan, ada langkah wajib yaitu menambahkan django_heroku.settings (lokal ()) dalam file settings.py.

Perubahan: Ketika saya mengubah baris di atas menjadi django_heroku.settings (penduduk lokal (), database = Salah), ia bekerja dengan sempurna.

Rishabh Aher
sumber
0

Dalam kasus saya, saya perlu menambahkan model saya ke file _ init _.py dari folder models di mana model saya didefinisikan:

from myapp.models.mymodel import MyModel
Robert Wallace
sumber
-1

Menambahkan 2c saya, karena tidak ada solusi yang bekerja untuk saya, tetapi ini ...

Saya baru saja lari manage.py squashmigrations dan menghapus migrasi lama (baik file dan baris di tabel database django.migrations).

Ini meninggalkan baris seperti ini di file migrasi terakhir:

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

Ini tampaknya membingungkan Django dan menyebabkan perilaku aneh: berlari manage.py makemigrations my_appakan menciptakan migrasi awal seolah-olah tidak ada. Menghapus replaces...garis memperbaiki masalah!

pembuat web
sumber
-1

python manage.py akun makemigrasi Migrasi untuk 'akun': akun \ migrasi \ 0001_initial.py - Buat model Pelanggan - Buat model Tag - Buat model Produk - Buat model Produk - Buat model Pesanan

Catatan: di sini "akun" adalah nama aplikasi saya

Vijay Choudhary
sumber