Bagaimana cara mengubah nama aplikasi Django?

156

Saya telah mengubah nama aplikasi di Django dengan mengganti nama foldernya, impor dan semua referensi (templat / indeks). Tapi sekarang saya mendapatkan kesalahan ini ketika saya mencoba menjalankanpython manage.py runserver

Error: Could not import settings 'nameofmynewapp.settings' (Is it on sys.path?): No module named settings

Bagaimana saya bisa men-debug dan mengatasi kesalahan ini? Ada petunjuk?

André
sumber
Hai danihp. Ya saya punya. Saya juga menggunakan virtualenv, saya tidak tahu Jika itu ada hubungannya dengan.
André
1
Jika, jika Anda menggunakan PyCharm, renamefitur ini akan sangat membantu Anda dalam hal ini.
Anto
1
Bukankah South mendukung operasi semacam itu?
andilabs

Jawaban:

285

Ikuti langkah-langkah ini untuk mengubah nama aplikasi di Django:

  1. Ganti nama folder yang ada di root proyek Anda
  2. Ubah referensi untuk aplikasi Anda di dependensi mereka, yaitu aplikasi views.py, urls.py, 'manage.py', dan settings.pyfile.
  3. Edit tabel database django_content_typedengan perintah berikut:UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'
  4. Juga jika Anda memiliki model, Anda harus mengganti nama tabel model. Untuk penggunaan postgres ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName. Untuk mysql juga saya pikir itu sama (seperti yang disebutkan oleh @null_radix)
  5. (Untuk Django> = 1,7) Update django_migrationsmeja untuk menghindari migrasi sebelumnya kembali menjalankan: UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>'. Catatan : ada beberapa perdebatan (dalam komentar) jika langkah ini diperlukan untuk Django 1.8+; Jika seseorang tahu pasti silakan perbarui di sini.
  6. Jika models.pyMeta Class Anda telah app_nameterdaftar, pastikan untuk mengganti nama juga (disebutkan oleh @will).
  7. Jika Anda telah menamai folder staticatau templatesfolder Anda di dalam aplikasi, Anda juga harus mengganti nama folder tersebut. Misalnya, ganti nama old_app/static/old_appmenjadi new_app/static/new_app.
  8. Untuk mengganti nama Django models, Anda harus mengubah django_content_type.nameentri dalam DB. Untuk penggunaan postgreSQLUPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'

Meta point (Jika menggunakan virtualenv): Perlu dicatat, jika Anda mengganti nama direktori yang berisi virtualenv Anda, kemungkinan akan ada beberapa file di env Anda yang berisi path absolut dan juga perlu diperbarui. Jika Anda mendapatkan kesalahan seperti ImportError: No module named ...ini mungkin pelakunya. (terima kasih kepada @danyamachine untuk menyediakan ini).

Referensi lain: Anda mungkin juga ingin merujuk tautan di bawah ini untuk gambar yang lebih lengkap

  1. Mengganti nama aplikasi dengan Django dan Selatan
  2. Bagaimana cara memigrasi model dari satu aplikasi Django ke aplikasi baru?
  3. Bagaimana cara mengubah nama aplikasi Django?
  4. Mundur migrasi dengan Django Selatan
  5. Cara termudah untuk mengubah nama model menggunakan Django / South?
  6. Kode python (terima kasih kepada A.Raouf ) untuk mengotomatiskan langkah-langkah di atas (Kode yang belum diuji. Anda telah diperingatkan!)
  7. Kode python (terima kasih kepada rafaponieman ) untuk mengotomatiskan langkah-langkah di atas (Kode yang belum diuji. Anda telah diperingatkan!)
Srikar Appalaraju
sumber
3
Juga jika Anda memiliki model, Anda harus mengganti nama tabel model. Untuk penggunaan postgres ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
null_radix
11
Dan jika Anda menggunakan migrasi baru, Anda harus mengubah nama aplikasi di file migrasi yang ada dan tabel django_migrations. Mungkin lebih baik untuk menekan migrasi terlebih dahulu sehingga ada lebih sedikit untuk diedit.
James
7
Untuk Postgres, Jika Anda juga ingin mengganti nama urutannya, gunakan ALTER SEQUENCE <oldAppName>_<modelName>_<PK>_seq RENAME TO <newAppName>_<modelName>_<PK>_seq;. Meskipun tidak perlu, sistem itu sendiri tidak peduli dengan namanya. Kolom DEFAULT menyimpan sebuah OID( 'foo_pkey_seq'::regclass), Anda dapat mengubah nama urutan tanpa memecahkannya - OID tetap sama.
Konstantine Kalbazov
3
Akan lebih bagus jika Anda memperbarui jawaban Anda untuk memasukkan apa yang dikatakan James tentang peningkatan file migrasi (seperti nama modul ketergantungan) ... tidak bisa mengetahuinya cukup lama.
u3l
2
Berikut adalah perintah manajemen yang memungkinkan penggantian nama model sesuai dengan solusi @ SrikarAppalaraju: gist.github.com/rafaponieman/201054ddf725cda1e60be3fe845850a5 Ia menerima old_name, new_name, dan kelas sebagai parameter (semua diformat seperti yang terlihat pada tabel dan bidang basis data).
rafaponieman
32

Baru di Django 1.7 adalah registri aplikasi yang menyimpan konfigurasi dan menyediakan introspeksi. Mesin ini memungkinkan Anda mengubah beberapa atribut aplikasi.

Poin utama yang ingin saya sampaikan adalah bahwa mengganti nama aplikasi tidak selalu diperlukan: Dengan konfigurasi aplikasi dimungkinkan untuk menyelesaikan aplikasi yang bertentangan. Tetapi juga cara untuk pergi jika aplikasi Anda membutuhkan penamaan yang ramah.

Sebagai contoh, saya ingin memberi nama aplikasi polling saya, 'Umpan balik dari pengguna'. Bunyinya seperti ini:

Buat apps.pyfile di pollsdirektori:

from django.apps import AppConfig

class PollsConfig(AppConfig):
    name = 'polls'
    verbose_name = "Feedback from users"

Tambahkan konfigurasi aplikasi default ke polls/__init__.py:

default_app_config = 'polls.apps.PollsConfig'

Untuk konfigurasi aplikasi lebih lanjut: https://docs.djangoproject.com/en/1.7/ref/applications/

semuanya
sumber
13

Masalah menyenangkan! Saya harus segera mengganti nama banyak aplikasi, jadi saya melakukan dry run.

Metode ini memungkinkan kemajuan dibuat dalam langkah-langkah atom, untuk meminimalkan gangguan bagi pengembang lain yang bekerja pada aplikasi yang Anda ganti namanya.

Lihat tautan di bagian bawah jawaban ini untuk contoh kode yang berfungsi.

  1. Siapkan kode yang ada untuk langkah ini :
    • Buat konfigurasi aplikasi (atur namedan labelke default).
    • Tambahkan konfigurasi aplikasi ke INSTALLED_APPS.
    • Pada semua model, atur secara eksplisit db_tableke nilai saat ini.
    • Migrasi dokter jadi db_table"selalu" didefinisikan secara eksplisit.
    • Pastikan tidak ada migrasi yang diperlukan (periksa langkah sebelumnya).
  2. Ubah label aplikasi :

    • Setel labelkonfigurasi aplikasi ke nama aplikasi baru.
    • Perbarui migrasi dan kunci asing untuk referensi label aplikasi baru.
    • Perbarui template untuk tampilan berbasis kelas umum ( jalur defaultnya adalah<app_label>/<model_name>_<suffix>.html )
    • Jalankan SQL mentah untuk memperbaiki migrasi dan content_typesaplikasi (sayangnya, beberapa SQL mentah tidak dapat dihindari). Anda tidak dapat menjalankan ini dalam migrasi.

      UPDATE django_migrations
         SET app = 'catalogue'
       WHERE app = 'shop';
      
      UPDATE django_content_type
         SET app_label = 'catalogue'
       WHERE app_label = 'shop';
    • Pastikan tidak ada migrasi yang diperlukan (periksa langkah sebelumnya).

  3. Ganti nama tabel :
    • Hapus "custom" db_table.
    • Jalankan makemigrationsbegitu Django dapat mengubah nama tabel "ke default".
  4. Pindahkan file :
    • Ganti nama direktori modul.
    • Perbaiki impor.
    • Perbarui konfigurasi aplikasi name.
    • Perbarui tempat INSTALLED_APPSreferensi konfigurasi aplikasi.
  5. Rapikan :
    • Hapus konfigurasi aplikasi khusus jika tidak lagi diperlukan.
    • Jika konfigurasi aplikasi hilang, jangan lupa juga untuk menghapusnya INSTALLED_APPS.

Contoh solusi: Saya telah membuat app-rename-example , contoh proyek tempat Anda dapat melihat bagaimana saya mengganti nama aplikasi, satu komit sekaligus.

Contoh ini menggunakan Python 2.7 dan Django 1.8, tapi saya yakin proses yang sama akan bekerja pada setidaknya Python 3.6 dan Django 2.1.

bersifat jala
sumber
1
Terima kasih @meshy. Itu benar-benar membantu saya mengubah nama aplikasi yang sangat besar. Satu saran, setelah menjalankan migrasi terakhir Anda dapat menghapus semua file migrasi dan membuat ulang file migrasi awal yang akan membantu Anda jika Anda melakukan pengujian integrasi berkelanjutan jika tidak CI akan gagal membuat database pengujian.
Rohan
Saya telah menulis ini dengan harapan migrasi bisa dijalankan dari awal setelah proses selesai. Jika migrasi gagal, mungkin salah satu dari kami melewatkan sesuatu. Saya akan memikirkannya, dan melihat apakah ada langkah-langkah lain yang perlu saya tambahkan.
sangat baik
@Rohan apakah ada informasi yang bisa Anda berikan secara terperinci bagaimana migrasi gagal?
sangat baik
Jika Anda menjalankan tes secara lokal dengan file migrasi lama Anda dapat melihatnya akan gagal membuat tabel @meshy
Rohan
1
Rencana permainan ini berfungsi dengan baik untuk saya. Selama setiap langkah dikerahkan melalui semua checkout aktif (CI, pengembang lain, produksi, dll) sebelum langkah selanjutnya ditangani, itu bekerja dengan baik - tidak ada masalah dengan migrasi historis yang ada. Lakukan langkah-langkah secara berurutan, dan sebarkan perubahan di mana-mana sebelum pindah ke langkah berikut.
user85461
11

Jika Anda menggunakan PyCharm dan proyek berhenti berfungsi setelah mengganti nama:

  1. Edit konfigurasi Run / Debug dan ubah variabel lingkungan DJANGO_SETTINGS_MODULE, karena ini menyertakan nama proyek Anda.
  2. Buka Pengaturan / Bahasa & Kerangka Kerja / Django dan perbarui lokasi file pengaturan.
Maziyar Mk
sumber
1
Ini adalah salah satu situasi di mana menemukan dan mengganti saya gagal. Terima kasih telah menunjukkan ini.
ruaanvds
0

Migrasi ulang pendekatan untuk pelat pembersih.

Ini bisa dilakukan tanpa rasa sakit JIKA aplikasi lain tidak mengganti model kunci asing dari aplikasi yang akan diganti namanya. Periksa dan pastikan file migrasi mereka tidak mencantumkan migrasi apa pun dari yang ini.

  1. Cadangkan basis data Anda. Buang semua tabel dengan a) skema + data untuk kemungkinan dependensi melingkar, dan b) hanya data untuk memuat ulang.
  2. Jalankan tes Anda.
  3. Periksa semua kode ke dalam VCS.
  4. Hapus tabel database aplikasi yang akan diganti namanya.
  5. Hapus izin: delete from auth_permission where content_type_id in (select id from django_content_type where app_label = '<OldAppName>')
  6. Hapus jenis konten: delete from django_content_type where app_label = '<OldAppName>'
  7. Ganti nama folder aplikasi.
  8. Ubah referensi untuk aplikasi Anda di dependensi mereka, yaitu aplikasi views.py, urls.py, 'manage.py', dan settings.pyfile.
  9. Hapus migrasi: delete from django_migrations where app = '<OldAppName>'
  10. Jika models.pyMeta Class Anda telah app_nameterdaftar, pastikan untuk mengganti nama juga (disebutkan oleh @will).
  11. Jika Anda telah menamai folder staticatau templatesfolder Anda di dalam aplikasi, Anda juga harus mengganti nama folder tersebut. Misalnya, ganti nama old_app/static/old_appmenjadi new_app/static/new_app.
  12. Jika Anda menetapkan konfigurasi aplikasi di apps.py; ganti nama itu, dan ganti nama referensi mereka di pengaturan.INSTALLED_APPS
  13. Hapus file migrasi.
  14. Buat ulang migrasi, dan migrasi.
  15. Muat data tabel Anda dari cadangan.
mehmet
sumber
0

Jika Anda menggunakan Pycharm , mengubah nama aplikasi sangat mudah dengan refactoring ( Shift+ F6default) untuk semua file proyek.
Tetapi pastikan Anda menghapus __pycache__folder di direktori proyek & sub-direktori-nya. Berhati-hatilah karena juga mengganti nama komentar yang dapat Anda kecualikan di jendela pratinjau refactor yang akan ditampilkan kepada Anda.
Dan Anda harus mengganti nama OldNameConfig (AppConfig): sebagai tambahan apps.pydari aplikasi yang diubah namanya.

Jika Anda tidak ingin kehilangan data dari basis data Anda, Anda harus melakukannya secara manual dengan kueri dalam basis data seperti jawaban yang disebutkan di atas.

Krs Subangkar
sumber
-3

Mengapa tidak gunakan saja opsi Find and Replace. (setiap editor kode memilikinya)?

Misalnya Kode Visual Studio (di bawah opsi Edit):

Opsi Visual Studio Code: 'Ganti dalam file'

Anda cukup mengetikkan nama lama dan nama baru dan mengganti semua barang dalam proyek dengan satu klik.

CATATAN : Ini hanya mengganti nama konten file, BUKAN nama file dan folder. Jangan lupa mengganti nama folder, mis. templates/my_app_name/ganti namanya menjaditemplates/my_app_new_name/

elano7
sumber