Bir Django uygulamasının adı nasıl değiştirilir?


157

Klasörünü, ithalatını ve tüm referanslarını (şablonlar / dizinler) yeniden adlandırarak Django'daki bir uygulamanın adını değiştirdim. Ama şimdi koşmaya çalıştığımda bu hatayı alıyorumpython manage.py runserver

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

Bu hatayı nasıl hata ayıklayabilir ve çözebilirim? Herhangi bir ipucu var mı?


Selam danihp. Evet bende var. Ben de virtualenv kullanıyorum, bunun bir ilgisi olup olmadığını bilmiyorum.
André

1
Herhangi bir şansla, PyCharm'ı kullanıyorsanız, renameözelliği size bu konuda çok yardımcı olacaktır.
Anto

1
South böyle bir operasyonu desteklemiyor mu?
andilabs

Yanıtlar:


286

Bir uygulamanın adını Django'da değiştirmek için şu adımları izleyin:

  1. Proje kökünüzdeki klasörü yeniden adlandırın
  2. , Bağımlılıkları uygulamanıza ilişkin referansları değiştirin uygulamanın yani views.py, urls.py'manage.py' ve settings.pydosyaları.
  3. Veritabanı django_content_typekomutunu aşağıdaki komutla düzenleyin:UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'
  4. Ayrıca modelleriniz varsa, model tablolarını yeniden adlandırmanız gerekecektir. Postgres için kullanın ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName. MySQL için de aynı olduğunu düşünüyorum (@null_radix tarafından belirtildiği gibi)
  5. (Django> = 1.7 için) güncelleyin django_migrationsönceki göçler yeniden çalıştırılırsa zorunda kalmamak için tablo: UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>'. Not : Bu adım Django 1.8+ için gerekliyse bazı tartışmalar vardır (yorumlarda); Birisi kesin olarak bilirse lütfen buradan güncelleyin.
  6. models.py' Sizin Meta Sınıfı app_namelistelenmişse, bunu da yeniden adlandırdığınızdan emin olun (@will ile belirtilir).
  7. Eğer isimalanlı ettiyseniz staticya templatesuygulamanızın içinde klasörler, ayrıca bu adlandırmak gerekir. Örneğin, adlandırmak old_app/static/old_appiçin new_app/static/new_app.
  8. Django adını yeniden adlandırmak için DB'deki girişi modelsdeğiştirmeniz gerekir django_content_type.name. PostgreSQL kullanımı içinUPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'

Meta noktası (virtualenv kullanıyorsanız): Dikkat çekmeye değer, virtualenv'inizi içeren dizini yeniden adlandırıyorsanız, muhtemelen envinizde mutlak bir yol içeren ve ayrıca güncellenmesi gereken birkaç dosya olacaktır. Böyle hatalar ImportError: No module named ...alıyorsanız suçlu olabilir. (bunu sağladığı için @danyamachine'e teşekkürler).

Diğer referanslar: Daha eksiksiz bir resim için aşağıdaki bağlantılara da başvurmak isteyebilirsiniz

  1. Bir uygulamayı Django ve Güney ile yeniden adlandırma
  2. Bir modeli bir django uygulamasından yeni bir modele nasıl taşıyabilirim?
  3. Bir Django uygulamasının adı nasıl değiştirilir?
  4. Django South ile geriye doğru göç
  5. Django / South kullanarak bir modeli yeniden adlandırmanın en kolay yolu?
  6. Yukarıdaki adımları otomatikleştirmek için Python kodu ( A.Raouf sayesinde ) (Test edilmemiş kod. Uyarıldınız!)
  7. Yukarıdaki adımları otomatikleştirmek için Python kodu ( rafaponieman sayesinde ) (Test edilmemiş kod. Uyarıldınız!)

3
Ayrıca modelleriniz varsa, model tablolarını yeniden adlandırmanız gerekecektir. Postgres kullanımı için ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
null_radix

11
Yeni taşıma işlemlerini kullanıyorsanız, mevcut taşıma dosyalarındaki ve django_migrations tablosundaki uygulama adını değiştirmeniz gerekir. Öncelikle taşıma işlemlerini ezmek daha iyi olabilir, bu nedenle düzenlenecek daha az şey vardır.
James

7
Postgres için, diziyi de yeniden adlandırmak istiyorsanız, kullanın ALTER SEQUENCE <oldAppName>_<modelName>_<PK>_seq RENAME TO <newAppName>_<modelName>_<PK>_seq;. Gerekli olmasa da, sistemin adı umursamıyor. DEFAULT sütunu bir OID( 'foo_pkey_seq'::regclass) depolar , dizinin adını bozmadan değiştirebilirsiniz - OID aynı kalır.
Konstantine Kalbazov

3
Cevabınızı James'in geçiş dosyalarını (bağımlılık modülü adları gibi) yükseltme hakkında söylediklerini içerecek şekilde güncellerseniz harika olur ... ... bunu biraz anlayamadık.
u3l

2
@ SrikarAppalaraju'nun çözümüne göre model yeniden adlandırmaya izin veren bir yönetim komutu şöyledir: gist.github.com/rafaponieman/201054ddf725cda1e60be3fe845850a5 Eski_adı, yeni_adı ve sınıfları parametre olarak kabul eder (veritabanı tablolarında ve alanlarında göründüğü gibi biçimlendirilir).
rafaponieman

32

Django 1.7'de Yeni, yapılandırmayı depolayan ve içgözlem sağlayan bir uygulama kayıt defteri. Bu makine, çeşitli uygulama özelliklerini değiştirmenize izin verir.

Belirtmek istediğim ana nokta, bir uygulamayı yeniden adlandırmanın her zaman gerekli olmamasıdır: Uygulama yapılandırmasıyla çakışan uygulamaları çözmek mümkündür. Ayrıca, uygulamanızın kolay adlandırma ihtiyacı varsa gitmenin yolu.

Örnek olarak, anketler uygulamamı 'Kullanıcılardan geri bildirim' olarak adlandırmak istiyorum. Bu böyle devam ediyor:

Dizinde bir apps.pydosya oluşturun polls:

from django.apps import AppConfig

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

Varsayılan uygulama yapılandırmasını şu adrese ekleyin polls/__init__.py:

default_app_config = 'polls.apps.PollsConfig'

Daha fazla uygulama yapılandırması için: https://docs.djangoproject.com/en/1.7/ref/applications/


13

Eğlenceli bir sorun! Yakında birçok uygulamayı yeniden adlandırmam gerekecek, bu yüzden kuru bir çalışma yaptım.

Bu yöntem, yeniden adlandırmakta olduğunuz uygulama üzerinde çalışan diğer geliştiricilerin aksamalarını en aza indirmek için atomik adımlarla ilerleme kaydedilmesini sağlar.

Çalışan örnek kod için bu cevabın altındaki bağlantıya bakın.

  1. Mevcut kodu taşıma için hazırlayın :
    • Bir uygulama yapılandırması oluşturun ( nameve labelvarsayılanlara ayarlayın ).
    • Uygulama yapılandırmasını adresine ekleyin INSTALLED_APPS.
    • Tüm modellerde, açıkça db_tablegeçerli değere ayarlanır .
    • Doktor göçleri db_table"her zaman" açıkça tanımlanmıştır.
    • Hiçbir taşıma işleminin gerekli olmadığından emin olun (önceki adımı kontrol edin).
  2. Uygulama etiketini değiştirin :

    • Set labelyeni uygulama adının uygulama config.
    • Yeni uygulama etiketine başvurmak için taşıma işlemlerini ve yabancı anahtarları güncelleyin.
    • Genel sınıf tabanlı görünümler için güncelleme şablonları ( varsayılan yol<app_label>/<model_name>_<suffix>.html )
    • Taşımaları ve content_typesuygulamayı düzeltmek için ham SQL'i çalıştırın (maalesef bazı ham SQL'ler kaçınılmazdır). Bunu bir taşıma işleminde çalıştıramazsınız.

      UPDATE django_migrations
         SET app = 'catalogue'
       WHERE app = 'shop';
      
      UPDATE django_content_type
         SET app_label = 'catalogue'
       WHERE app_label = 'shop';
      
    • Hiçbir taşıma işleminin gerekli olmadığından emin olun (önceki adımı kontrol edin).

  3. Tabloları yeniden adlandırın :
    • "Özel" i kaldırın db_table.
    • makemigrationsBöylece django "varsayılan" tabloyu yeniden adlandırabilirsiniz çalıştırın .
  4. Dosyaları taşıyın :
    • Modül dizinini yeniden adlandırın.
    • İçe aktarmaları düzeltin.
    • Uygulama yapılandırmalarını güncelleyin name.
    • INSTALLED_APPSUygulama yapılandırmasına referans veren yeri güncelleyin .
  5. Düzenleyin :
    • Artık gerekmiyorsa özel uygulama yapılandırmasını kaldırın.
    • Uygulama yapılandırması kaybolduysa, uygulamayı da kaldırmayı unutmayın INSTALLED_APPS.

Örnek çözüm: Bir uygulamayı nasıl yeniden adlandırdığımı görebileceğiniz örnek bir proje olan app-rename-example oluşturdum .

Örnek Python 2.7 ve Django 1.8 kullanıyor, ancak aynı sürecin en azından Python 3.6 ve Django 2.1 üzerinde çalışacağından eminim.


1
Teşekkürler @meshy. Gerçekten büyük bir uygulamayı yeniden adlandırmama yardımcı oldu. Bir öneri, son geçişi çalıştırdıktan sonra tüm geçiş dosyalarını silebilir ve herhangi bir sürekli entegrasyon testi yapıyorsanız size yardımcı olacak ilk geçiş dosyasını yeniden oluşturabilirsiniz, aksi takdirde CI test veritabanını oluşturamaz.
Rohan

Bunu, işlem bittikten sonra göçlerin sıfırdan çalıştırılabileceği beklentisiyle yazmıştım. Göçler başarısız olursa, belki de birimiz bir şeyleri kaçırdık. Bu konuda bir düşüneceğim ve eklemem gereken başka adımlar olup olmadığını göreceğim.
Ağustos'ta ağustos

@Rohan, taşıma işlemlerinin nasıl başarısız olduğunu ayrıntılı olarak açıklamak için verebileceğiniz herhangi bir bilgi var mı?
Ağustos'ta ağustos

Testi eski geçiş dosyalarıyla yerel olarak çalıştırırsanız, tabloları oluşturmanın başarısız olduğunu görebilirsiniz @meshy
Rohan

1
Bu oyun planı benim için mükemmel çalıştı. Her adım, bir sonraki adım ele alınmadan önce tüm aktif check-out'larda (CI, diğer geliştiriciler, üretim vb.) Dağıtıldığı sürece, mükemmel çalıştı - mevcut tarihsel göçlerle ilgili sorun yok. Adımları sırayla yapın ve bir sonraki adıma geçmeden önce değişiklikleri her yerde yayın.
user85461

11

PyCharm'ı kullanıyorsanız ve yeniden adlandırdıktan sonra proje durursa:

  1. Proje adınızı içerdiği için Çalıştır / Hata Ayıkla yapılandırmasını düzenleyin ve DJANGO_SETTINGS_MODULE ortam değişkenini değiştirin.
  2. Ayarlar / Diller ve Çerçeveler / Django'ya gidin ve ayarlar dosyasının konumunu güncelleyin.

1
Bu, bul ve değiştir işleminin başarısız olduğu durumlardan biri. Bunu işaret ettiğiniz için teşekkürler.
ruaanvds

0

Daha temiz bir plaka için yaklaşımı yeniden taşıyın.

Bu diğer uygulamalar yeniden adlandırılacak uygulamadan yabancı anahtar modelleri yoksa ağrısız bir şekilde yapılabilir. Taşıma dosyalarının bu dosyadaki taşıma işlemlerini listelemediğinden emin olun.

  1. Veritabanınızı yedekleyin. A) data + şemasını içeren tüm tabloları olası dairesel bağımlılıklar için dökün ve b) yalnızca yeniden yükleme için verileri kullanın.
  2. Testlerinizi yapın.
  3. Tüm kodu VCS'de kontrol edin.
  4. Yeniden adlandırılacak uygulamanın veritabanı tablolarını silin.
  5. İzinleri silin: delete from auth_permission where content_type_id in (select id from django_content_type where app_label = '<OldAppName>')
  6. İçerik türlerini silin: delete from django_content_type where app_label = '<OldAppName>'
  7. Uygulamanın klasörünü yeniden adlandırın.
  8. , Bağımlılıkları uygulamanıza ilişkin referansları değiştirin uygulamanın yani views.py, urls.py'manage.py' ve settings.pydosyaları.
  9. Taşımaları sil: delete from django_migrations where app = '<OldAppName>'
  10. models.py' Sizin Meta Sınıfı app_namelistelenmişse, bunu da yeniden adlandırdığınızdan emin olun (@will ile belirtilir).
  11. Eğer isimalanlı ettiyseniz staticya templatesuygulamanızın içinde klasörler, ayrıca bu adlandırmak gerekir. Örneğin, adlandırmak old_app/static/old_appiçin new_app/static/new_app.
  12. App config dosyası için app config tanımladıysanız; bunları yeniden adlandırın ve referanslarını ayarlarında yeniden adlandırın.
  13. Taşıma dosyalarını silin.
  14. Taşıma işlemlerini yeniden yapın ve taşıyın.
  15. Tablo verilerinizi yedeklemelerden yükleyin.

0

Eğer kullanırsanız pycharm , bir uygulamayı yeniden adlandırma çok kolay olduğu üstlenmeden ( Shift+ F6tüm proje dosyaları için varsayılan).
Ancak __pycache__proje dizinindeki ve alt dizinlerindeki klasörleri sildiğinizden emin olun . Ayrıca, göstereceği refactor önizleme penceresinde hariç tutabileceğiniz yorumları da yeniden adlandırdığından dikkatli olun.
Ayrıca apps.py, yeniden adlandırılan uygulamanızda da OldNameConfig (AppConfig): adını değiştirmeniz gerekir.

Veritabanınızın verilerini kaybetmek istemiyorsanız, veritabanında yukarıda belirtilen yanıt gibi sorgu ile el ile yapmanız gerekir.


-3

Neden sadece Bul ve Değiştir seçeneğini kullanmıyorsunuz? (her kod düzenleyicide vardır)?

Örneğin, Visual Studio Code (Düzenle seçeneği altında):

Visual Studio Code seçeneği: 'Dosyalarda değiştir'

Sadece eski adı ve yeni adı yazın ve projedeki her şeyi tek bir tıklamayla değiştirin.

NOT : Bu, dosya ve klasör adlarını DEĞİL yalnızca dosya içeriğini yeniden adlandırır. Klasörleri yeniden adlandırmayı unutmayın, örn. templates/my_app_name/olarak yeniden adlandırtemplates/my_app_new_name/

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.