Jawaban ini untuk kasus serupa jika jawaban teratas oleh Alasdair tidak membantu . (Misalnya jika migrasi yang tidak diinginkan segera dibuat lagi dengan setiap migrasi baru atau jika itu dalam migrasi yang lebih besar yang tidak dapat dikembalikan atau tabel telah dihapus secara manual.)
... hapus migrasi, tanpa membuat migrasi baru?
TL; DR : Anda dapat menghapus beberapa migrasi yang terakhir dikembalikan (bingung) dan membuat yang baru setelah memperbaiki model . Anda juga dapat menggunakan metode lain untuk mengonfigurasinya agar tidak membuat tabel dengan perintah migrasi. Migrasi terakhir harus dibuat agar sesuai dengan model saat ini .
Kasus mengapa ada orang yang tidak ingin membuat tabel untuk Model yang harus ada:
A) Tidak ada tabel seperti itu harus ada di tidak ada database di mesin tidak dan tidak ada kondisi
- Kapan: Ini adalah model dasar yang dibuat hanya untuk pewarisan model dari model lain.
- Solusi: Tetapkan
class Meta: abstract = True
B) Tabel jarang dibuat, oleh sesuatu yang lain atau secara manual dengan cara khusus.
- Solusi: Gunakan
class Meta: managed = False
Migrasi dibuat, tetapi tidak pernah digunakan, hanya dalam tes. File migrasi penting, jika tidak, tes database tidak dapat berjalan, mulai dari keadaan awal yang dapat direproduksi.
C) Tabel ini hanya digunakan pada beberapa mesin (misalnya dalam pengembangan).
- Solusi: Pindahkan model ke aplikasi baru yang ditambahkan ke INSTALLED_APPS hanya dalam kondisi khusus atau gunakan kondisional
class Meta: managed = some_switch
.
D) Proyek ini menggunakan banyak basis data disettings.DATABASES
- Solusi: Tulis router Database dengan metode
allow_migrate
untuk membedakan database di mana tabel harus dibuat dan di mana tidak.
Migrasi dibuat dalam semua kasus A), B), C), D) dengan Django 1.9+ (dan hanya dalam kasus B, C, D dengan Django 1.8), tetapi diterapkan ke database hanya dalam kasus yang sesuai atau mungkin tidak pernah jika diperlukan begitu. Migrasi diperlukan untuk menjalankan tes sejak Django 1.8. Keadaan saat ini yang relevan lengkap dicatat oleh migrasi bahkan untuk model dengan managed = False di Django 1.9+ agar dimungkinkan untuk membuat ForeignKey antara model yang dikelola / tidak dikelola atau untuk dapat membuat model dikelola = Benar nanti. (Pertanyaan ini telah ditulis pada saat Django 1.8. Semuanya di sini harus valid untuk versi antara 1,8 hingga saat ini 2.2.)
Jika migrasi terakhir tidak mudah dikembalikan maka dimungkinkan untuk berhati-hati (setelah cadangan basis data) melakukan pengembalian palsu ./manage.py migrate --fake my_app 0010_previous_migration
, hapus tabel secara manual.
Jika perlu, buat migrasi tetap dari model tetap dan terapkan tanpa mengubah struktur basis data ./manage.py migrate --fake my_app 0011_fixed_migration
.