Django - makemigrations - Tidak ada perubahan yang terdeteksi

138

Saya mencoba membuat migrasi dalam aplikasi yang ada menggunakan perintah makemigrations tetapi menghasilkan "Tidak ada perubahan yang terdeteksi".

Biasanya saya membuat aplikasi baru menggunakan startappperintah tetapi tidak menggunakannya untuk aplikasi ini ketika saya membuatnya.

Setelah debugging, saya menemukan bahwa itu tidak membuat migrasi karena migrationspaket / folder hilang dari suatu aplikasi.

Apakah akan lebih baik jika membuat folder jika tidak ada atau saya kehilangan sesuatu?

Dilraj
sumber
13
Apakah Anda memiliki aplikasi Anda ditambahkan ke INSTALLED_APPS?
wolendranh
6
Ya itu dalam aplikasi yang terinstal, untuk pertama kalinya, lebih baik digunakan makemigrations <myapp>seperti yang ditunjukkan Alasdair.
Dilraj
1
Hapus 'abstract = True' :)
GrvTyagi
'makemigrations' tidak berfungsi. 'makemigrations <myapp>' berhasil
Aseem

Jawaban:

267

Untuk membuat migrasi awal untuk suatu aplikasi, jalankan makemigrationsdan tentukan nama aplikasi. Folder migrasi akan dibuat.

./manage.py makemigrations <myapp>

Aplikasi Anda harus dimasukkan INSTALLED_APPSterlebih dahulu (di dalam settings.py).

Alasdair
sumber
15
Adakah alasan mengapa mereka <kadang-kadang> memaksa kita untuk menentukan aplikasi?
maazza
40
@maazza Anda harus menentukan nama aplikasi jika aplikasi tidak memiliki migrationsfolder. Ini bisa terjadi jika Anda membuat aplikasi secara manual, atau Anda telah memutakhirkan dari versi Django yang lebih lama yang tidak memiliki migrasi.
Alasdair
13
@maazza Sebenarnya Anda membutuhkan paket python (dengan __init__.py) bernama 'migrasi' di aplikasi.
Jibin
3
Kedengarannya seperti sesuatu yang harus ditangani Django secara otomatis.
dualitas_
1
@dualitas_ ini sesuai desain - Django tidak berasumsi bahwa Anda ingin migrasi untuk aplikasi Anda. Jika itu membuat migrasi untuk semua aplikasi, itu bisa menyebabkan kesalahan saat Anda menjalankan migrate.
Alasdair
49

Masalah saya (dan solusi) belum berbeda dari yang dijelaskan di atas.

Saya tidak menggunakan models.pyfile, tetapi membuat modelsdirektori dan membuat my_model.pyfile di sana, di mana saya meletakkan model saya. Django tidak dapat menemukan model saya sehingga tertulis bahwa tidak ada migrasi untuk diterapkan.

Solusi saya adalah: dalam my_app/models/__init__.pyfile saya menambahkan baris ini: from .my_model import MyModel

Karina Klinkevičiūtė
sumber
Ini berbahagia menjadi solusi bagi saya juga, tapi saya tidak mengerti mengapa ini terjadi. Apakah ada yang punya wawasan tentang apa yang menyebabkan ini?
Paul di Hout
Django memiliki jalur default tempat mencari model Anda. Jika struktur proyek berbeda, dan modelnya tidak di tempat biasa, mereka perlu diimpor di sana.
Karina Klinkevičiūtė
@ KarinaKlinkevičiūtė bagaimana jika saya harus menghapus model seperti itu?
Daniil Mashkin
@DaniilMashkin Saya membayangkan Anda perlu menghapus impor juga. Ini adalah salah satu cara penataan proyek Anda (bukan satu-satunya) dan Anda harus berurusan dengan tugas tambahan yang menyertainya jika Anda memilihnya :)
Karina Klinkevičiūtė
1
Saya menggunakan arsitektur "klasik" untuk model, kemudian saya pindah ke arsitektur "folder model", dan migrasi apa pun masih terdeteksi pada model saya yang ada. Namun, sekarang, ketika membuat model baru , saya memiliki masalah ini. Solusi Anda berfungsi dengan baik, tetapi membiarkan basis kode saya tidak konsisten karena terkadang ada impor, kadang tidak. Mungkin ada solusi yang lebih baik. Saya kira Django harus mengusulkan pengaturan dengan daftar folder yang harus dicari ketika mencoba mencari model baru.
David D.
43

Ada beberapa kemungkinan alasan untuk Django tidak mendeteksi apa yang harus dimigrasi selama makemigrationsperintah.

  1. folder migrasi Anda memerlukan paket migrasi di aplikasi Anda.
  2. INSTALLED_APPS Anda perlu aplikasi Anda ditentukan dalam INSTALLED_APPS.dict
  3. Verbositas dimulai dengan menjalankan makemigrations -v 3untuk verbositas. Ini mungkin menjelaskan masalah ini.
  4. Path lengkap Di INSTALLED_APPSdalamnya disarankan untuk menentukan path konfigurasi aplikasi modul lengkap 'apply.apps.MyAppConfig'
  5. --pengaturan Anda mungkin ingin memastikan file pengaturan yang benar diatur:manage.py makemigrations --settings mysite.settings
  6. tentukan nama aplikasi secara eksplisit masukkan nama aplikasi manage.py makemigrations myapp- yang mempersempit migrasi untuk aplikasi itu sendiri dan membantu Anda mengisolasi masalahnya.
  7. meta model periksa Anda memiliki hak app_labeldi meta model Anda

  8. Debug django debug skrip inti django. perintah makemigrations cukup mudah. Inilah cara melakukannya di pycharm . mengubah definisi naskah Anda sesuai (ex: makemigrations --traceback myapp)

Banyak basis data:

  • Db Router ketika bekerja dengan django db router, kelas router (kelas router kustom Anda) perlu mengimplementasikan allow_syncdbmetode ini.

makemigrations selalu membuat migrasi untuk perubahan model, tetapi jika allow_migrate () mengembalikan False,

pengguna1134422
sumber
1
Meliputi banyak skenario mengenai masalah, harus menjadi jawaban yang diterima.
Krishh
Kemungkinan lain: Nama yang salah sedang diimpor, yaitu mengimpor bidang dari formulir, bukan bidang, atau mengimpor model dari formulir, bukan model. Contoh: from recurrence.forms import RecurrenceFieldtapi seharusnya begitu from recurrence.fields import RecurrenceField.
lama
Satu lagi alasan. Pastikan bahwa model digunakan dalam rute untuk situs web (via admin atau sebaliknya). " makemigrationsScript mencari model yang terhubung dari urls.py". Ditemukan di sini stackoverflow.com/questions/43093651/…
Kyle
contoh cmd:python manage.py makemigrations -v 3 <app_name>
Charlie 木匠
Ketika saya menambahkan tabel, dan kemudian menambahkan kunci asing referensi tabel baru ini pada saat yang sama. Itu harus dibagi menjadi 2 langkah: pra langkah: tambahkan INSTALLED_APPS ke pengaturan. 1) buat tabel baru: python manage.py makemigrations <app_name>; 2) tambahkan Foreign Key: python manage.py makemigrations
Charlie 木匠
26

Saya telah membaca banyak jawaban untuk pertanyaan ini yang sering menyatakan hanya menjalankan makemigrationsbeberapa cara lain. Tetapi bagi saya, masalahnya ada di Metasubkelas model.

Saya memiliki konfigurasi aplikasi yang mengatakan label = <app name>(dalam apps.pyfile, di sebelah models.py, views.pydll). Jika kebetulan, meta class Anda tidak memiliki label yang sama dengan label aplikasi (misalnya karena Anda membagi satu aplikasi terlalu besar menjadi beberapa aplikasi), tidak ada perubahan yang terdeteksi (dan tidak ada pesan kesalahan yang membantu sama sekali). Jadi di kelas model saya sekarang:

class ModelClassName(models.Model):

    class Meta:
        app_label = '<app name>' # <-- this label was wrong before.

    field_name = models.FloatField()
    ...

Menjalankan Django 1.10 di sini.

onekiloparsec
sumber
13

Itu adalah komentar tetapi mungkin harus menjadi jawaban.

Pastikan nama aplikasi Anda ada di settings.py INSTALLED_APPSjika tidak, apa pun yang Anda lakukan tidak akan menjalankan migrasi.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'blog',
]

Lalu lari:

./manage.py makemigrations blog
stephen
sumber
tapi itu menciptakan nama tabel sebagai 'appname_modelname', ketika kita menjalankan perintah 'manage.py migrate'
Daniyal Javaid
Lihat opsi meta model untuk mengubah nama tabel
stephen
11

Saya punya masalah lain yang tidak dijelaskan di sini, yang membuat saya gila.

class MyModel(models.Model):
    name = models.CharField(max_length=64, null=True)  # works
    language_code = models.CharField(max_length=2, default='en')  # works
    is_dumb = models.BooleanField(default=False),  # doesn't work

Saya mengikuti ',' dalam satu baris mungkin dari salin & tempel. Baris dengan is_dumb tidak membuat migrasi model dengan './manage.py makemigrations' tetapi juga tidak menghasilkan kesalahan. Setelah menghapus ',' itu berfungsi seperti yang diharapkan.

Jadi berhati-hatilah saat Anda menyalin & menempel :-)

kamu
sumber
Tanda koma juga dapat menyebabkan bug di tempat lain; koma membuat pernyataan tuple, jadi is_dumbsama dengan (models.BooleanField(default=False), )yang makemigrationstidak tahu bagaimana mengkonversi ke kolom basis data.
lama
8

Terkadang ./manage.py makemigrationslebih unggul ./manage.py makemigrations <myapp>karena dapat menangani konflik tertentu antar aplikasi.

Kejadian-kejadian itu terjadi secara diam-diam dan butuh beberapa jam swearinguntuk memahami arti sebenarnya dari No changes detectedpesan yang ditakuti itu .

Oleh karena itu, ini adalah pilihan yang jauh lebih baik untuk menggunakan perintah berikut:

./manage.py makemigrations <myapp1> <myapp2> ... <myappN>

raratiru
sumber
7

Saya telah menyalin tabel dari luar Django dan kelas Meta default ke "managed = false". Sebagai contoh:

class Rssemailsubscription(models.Model):
    id = models.CharField(primary_key=True, max_length=36)
    ...
    area = models.FloatField('Area (Sq. KM)', null=True)

    class Meta:
        managed = False
        db_table = 'RSSEmailSubscription'

Dengan mengubah manged menjadi True, migrasi mulai mengambil perubahan.

Dan Cogswell
sumber
4
  1. Pastikan aplikasi Anda disebutkan di install_apps di settings.py
  2. Pastikan kelas model Anda memperpanjang model. Model
Amandeep Singh
sumber
2

Saya memecahkan masalah itu dengan melakukan ini:

  1. Hapus file "db.sqlite3". Masalahnya di sini adalah bahwa basis data Anda saat ini akan dihapus, jadi Anda harus membuat ulang lagi.
  2. Di dalam folder migrasi aplikasi Anda yang diedit, hapus file yang terakhir diperbarui. Ingat bahwa file yang dibuat pertama adalah: "0001_initial.py". Sebagai contoh: Saya membuat kelas baru dan mendaftarkannya dengan prosedur "makemigrations" dan "migrasi", sekarang file baru yang disebut "0002_auto_etc.py" telah dibuat; hapus itu.
  3. Buka folder " pycache " (di dalam folder migrasi) dan hapus file "0002_auto_etc.pyc".
  4. Terakhir, buka konsol dan gunakan "python manage.py makemigrations" dan "python manage.py migrate".
Juan David Argüello Plata
sumber
2

Saya lupa mengajukan argumen yang benar:

class LineInOffice(models.Model):   # here
    addressOfOffice = models.CharField("Корхоная жош",max_length= 200)   #and here
    ...

di models.py dan kemudian mulai drop yang menjengkelkan

Tidak ada perubahan yang terdeteksi di aplikasi 'myApp'

CodeToLife
sumber
2

Alasan lain yang mungkin adalah jika Anda memiliki beberapa model yang ditentukan dalam file lain (bukan dalam sebuah paket) dan belum mereferensikannya di tempat lain.

Bagi saya, hanya menambahkan from .graph_model import *ke admin.py(mana graph_model.pyadalah file baru) tetap masalah.

Nick Lothian
sumber
2

Masalah saya jauh lebih sederhana daripada jawaban di atas dan mungkin alasan yang jauh lebih umum selama proyek Anda sudah disiapkan dan berfungsi. Dalam salah satu aplikasi saya yang telah bekerja sejak lama, migrasi tampaknya tidak berhasil, jadi terburu-buru, saya melakukan hal berikut:

rm -r */migrations/*
rm db.sqlite3
python3 manage.py makemigrations
No changes detected

Apa??

Saya keliru juga menghapus semua __init__.pyfile :( - Semuanya berfungsi kembali setelah saya masuk dan:

touch ads1/migrations/__init__.py

Untuk setiap aplikasi saya kemudian makemigrationsbekerja kembali.

Ternyata saya telah secara manual membuat aplikasi baru dengan menyalin yang lain dan lupa untuk meletakkannya __init__.pydi migrationsfolder dan hal itu membatasi saya bahwa semuanya tidak akan berhasil - membuat saya semakin buruk dengan rm -rseperti yang dijelaskan di atas.

Semoga ini membantu seseorang dari bersumpah pada kesalahan "Tidak ada perubahan terdeteksi" selama beberapa jam.

drchuck
sumber
1

Solusinya adalah Anda harus memasukkan aplikasi Anda di INSTALLED_APPS.

Saya melewatkannya dan saya menemukan masalah yang sama.

setelah menentukan migrasi nama aplikasi saya menjadi berhasil

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'boards',
]

harap dicatat saya sebutkan papan di terakhir, yang merupakan nama aplikasi saya.

sradha
sumber
1

INSTALLED_APPS = [

'blog.apps.BlogConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',

]

pastikan 'blog.apps.BlogConfig', (ini termasuk dalam settings.py Anda untuk membuat migrasi aplikasi Anda)

kemudian jalankan python3 manage.py makemigrations blog atau nama aplikasi Anda

Piyush Chandra
sumber
1

Masalah yang sangat bodoh yang dapat Anda miliki juga adalah mendefinisikan dua class Metadalam model Anda. Dalam hal itu, perubahan apa pun pada yang pertama tidak akan diterapkan saat berjalan makemigrations.

class Product(models.Model):
    somefield = models.CharField(max_length=255)
    someotherfield = models.CharField(max_length=255)

    class Meta:
        indexes = [models.Index(fields=["somefield"], name="somefield_idx")]

    def somefunc(self):
        pass

    # Many lines...

    class Meta:
        indexes = [models.Index(fields=["someotherfield"], name="someotherfield_idx")]
nbeuchat
sumber
1

Saya tahu ini adalah pertanyaan lama tapi saya berjuang dengan masalah yang sama sepanjang hari dan solusi saya sederhana.

Saya memiliki struktur direktori saya sesuatu di sepanjang ...

apps/
   app/
      __init__.py
      app_sub1/
           __init__.py
           models.py
      app_sub2/
           __init__.py
           models.py
      app_sub3/
           __init__.py
           models.py
   app2/
      __init__.py
      app2_sub1/
           __init__.py
           models.py
      app2_sub2/
           __init__.py
           models.py
      app2_sub3/
           __init__.py
           models.py
    main_app/
      __init__.py
      models.py

Dan karena semua model lainnya sampai yang saya punya masalah dengan sedang diimpor di tempat lain yang akhirnya mengimpor dari main_appyang terdaftar di INSTALLED_APPS, saya hanya beruntung bahwa mereka semua bekerja.

Tetapi karena saya hanya menambahkan masing app- masing ke INSTALLED_APPSdan bukan app_sub*ketika saya akhirnya menambahkan file model baru yang tidak diimpor ke tempat lain, Django benar-benar mengabaikannya.

Perbaikan saya menambahkan models.pyfile ke direktori basis masing app- masing seperti ini ...

apps/
   app/
      __init__.py
      models.py <<<<<<<<<<--------------------------
      app_sub1/
           __init__.py
           models.py
      app_sub2/
           __init__.py
           models.py
      app_sub3/
           __init__.py
           models.py
   app2/
      __init__.py
      models.py <<<<<<<<<<--------------------------
      app2_sub1/
           __init__.py
           models.py
      app2_sub2/
           __init__.py
           models.py
      app2_sub3/
           __init__.py
           models.py
    main_app/
      __init__.py
      models.py

dan kemudian tambahkan from apps.app.app_sub1 import *dan seterusnya ke masing-masing file applevel models.py.

Bleh ... ini butuh waktu lama bagi saya untuk mencari tahu dan saya tidak dapat menemukan solusinya di mana pun ... Saya bahkan pergi ke halaman 2 dari hasil google.

Semoga ini bisa membantu seseorang!

Tim
sumber
1

Saya punya masalah serupa dengan Django 3.0, menurut bagian migrasi di dokumentasi resmi , menjalankan ini sudah cukup untuk memperbarui struktur tabel saya:

python manage.py makemigrations
python manage.py migrate

Tetapi hasilnya selalu sama: 'tidak ada perubahan yang terdeteksi' tentang model saya setelah saya menjalankan skrip 'makemigrations'. Saya mengalami kesalahan sintaks pada models.py pada model yang ingin saya perbarui di db:

field_model : models.CharField(max_length=255, ...)

dari pada:

field_model = models.CharField(max_length=255, ...)

Menyelesaikan kesalahan bodoh ini, dengan perintah itu migrasi dilakukan tanpa masalah. Mungkin ini membantu seseorang.

Yair Abad
sumber
0

Anda harus menambahkan polls.apps.PollsConfigke INSTALLED_APPSdalamsetting.py

kucing
sumber
0

Dalam kasus saya, saya lupa memasukkan argumen kelas

Salah:

class AccountInformation():

Benar

class AccountInformation(models.Model):
Jonas
sumber
0

Dalam kasus saya, saya pertama kali menambahkan bidang ke model, dan Django mengatakan tidak ada perubahan.

Daripada saya memutuskan untuk mengubah "nama tabel" dari model, macemigrations bekerja. Daripada saya mengubah nama tabel kembali ke default, dan bidang baru juga ada di sana.

Ada "bug" dalam sistem migrasi Django, kadang-kadang tidak melihat bidang baru. Mungkin terkait dengan bidang tanggal.

Tolga
sumber
0

Alasan yang mungkin bisa jadi adalah penghapusan file db yang ada dan folder migrasi yang dapat Anda gunakan python manage.py makemigrations <app_name>. Saya pernah menghadapi masalah yang sama.

Akash G Krishnan
sumber
0

Satu lagi kasus tepi dan solusi:

Saya menambahkan bidang boolean, dan pada saat yang sama menambahkan @ properti yang merujuknya, dengan nama yang sama (doh). Mengomentari properti dan migrasi melihat dan menambahkan bidang baru. Berganti nama menjadi properti dan semuanya baik-baik saja.

kgeo
sumber
0

Jika Anda memiliki managed = TrueMeta model Anda, Anda harus menghapusnya dan melakukan migrasi. Kemudian jalankan migrasi lagi, itu akan mendeteksi pembaruan baru.

Irshu
sumber
0

Saat menambahkan model baru ke aplikasi api Django dan menjalankan python manage.py makemigrationsalat tidak mendeteksi model baru.

Yang aneh adalah bahwa model lama memang dipilih makemigrations, tetapi ini karena mereka dirujuk dalam urlpatternsrantai dan alat entah bagaimana mendeteksi mereka. Jadi awasi perilaku itu.

Masalahnya adalah karena struktur direktori yang sesuai dengan paket model memiliki subpackages dan semua __init__.pyfile kosong. Mereka harus secara eksplisit mengimpor semua kelas yang diperlukan di setiap subfolder dan dalam model __init__.py untuk Django untuk mengambilnya dengan makemigrationsalat.

models
  ├── __init__.py          <--- empty
  ├── patient
     ├── __init__.py      <--- empty
     ├── breed.py
     └── ...
  ├── timeline
     ├── __init__.py      <-- empty
     ├── event.py
     └── ...
atoledo
sumber
0

Coba daftarkan model Anda di admin.py, berikut ini contohnya: - admin.site.register (YourModelHere)

Anda dapat melakukan hal-hal berikut: - 1. admin.site.register (YourModelHere) # Di admin.py 2. Muat ulang halaman dan coba lagi 3. Tekan CTRL-S dan simpan 4. Mungkin ada kesalahan, khususnya periksa model .py dan admin.py 5. Atau, pada akhirnya semuanya cukup restart server

GURU RAJ
sumber
0

Semoga ini bisa membantu orang lain, karena saya menghabiskan berjam-jam mencoba untuk mengejar ini.

Jika Anda memiliki fungsi dalam model Anda dengan nama yang sama, ini akan menghapus nilai. Cukup jelas di belakang, tapi tetap saja.

Jadi, jika Anda memiliki sesuatu seperti ini:

class Foobar(models.Model):
    [...]
    something = models.BooleanField(default=False)

    [...]
    def something(self):
        return [some logic]

Dalam hal ini, fungsi akan menimpa pengaturan di atas, membuatnya "tidak terlihat" makemigrations.

vpetersson
sumber
0

Hal terbaik yang dapat Anda lakukan adalah, Hapus database yang ada. Dalam kasus saya, saya menggunakan database SQL phpMyAdmin, jadi saya menghapus secara manual database yang dibuat di sana.

Setelah Menghapus: Saya membuat database di PhpMyAdmin, dan tidak menambahkan tabel apa pun.

Sekali lagi jalankan Perintah berikut:

python manage.py makemigrations

python manage.py migrate

Setelah Perintah-Perintah Ini : Anda dapat melihat Django secara otomatis membuat tabel-tabel lain yang diperlukan dalam Database (Kira-kira 10 tabel).

python manage.py makemigrations <app_name>

python manage.py migrate

Dan Terakhir: Setelah perintah di atas, semua model (tabel) yang Anda buat langsung diimpor ke database.

Semoga ini bisa membantu.

HITESH GUPTA
sumber
0

Masalah saya dengan kesalahan ini, adalah bahwa saya telah memasukkan:

class Meta:
   abstract = True

Di dalam model yang ingin saya buat migrasi untuk.

Dolidod Teethtard
sumber
0

Saya memiliki masalah berbeda saat membuat aplikasi baru bernama deals. Saya ingin memisahkan model di dalam aplikasi itu jadi saya punya 2 file model bernama deals.pydan dealers.py. Saat berlari python manage.py makemigrationssaya mendapat:No changes detected .

Saya pergi ke depan dan di dalam __init__.pyyang tinggal di direktori yang sama di mana file model saya tinggal (penawaran dan dealer) saya lakukan

from .deals import *
from .dealers import *

Dan kemudian makemigrations perintah itu bekerja.

Ternyata jika Anda tidak mengimpor model di mana pun ATAU nama file model Anda tidak models.pymaka model tidak akan terdeteksi.

Masalah lain yang terjadi pada saya adalah cara saya menulis aplikasi di settings.py:

Saya punya:

apps.deals

Seharusnya sudah termasuk folder proyek root:

cars.apps.deals
elad perak
sumber