Django ऐप का नाम कैसे बदलें?


156

मैंने Django में अपने फ़ोल्डर, आयात और उसके सभी संदर्भों (टेम्प्लेट / इंडेक्स) का नाम बदलकर एक ऐप का नाम बदल दिया है। लेकिन अब मुझे यह त्रुटि मिलती है जब मैं चलाने की कोशिश करता हूंpython manage.py runserver

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

मैं इस त्रुटि को कैसे डीबग और हल कर सकता हूं? कोई सुराग?


हाय दानीहप। हाँ मेरे पास है। मैं भी virtualenv का उपयोग कर रहा हूँ, मुझे नहीं पता कि अगर कुछ करना है।
एंड्रे

1
यदि, किसी भी संयोग से, आप PyCharm का उपयोग कर रहे हैं, तो इसकी renameविशेषता आपको इससे बहुत मदद करेगी।
Anto

1
क्या दक्षिण में इस तरह का ऑपरेशन नहीं है?
औरलैब्स

जवाबों:


285

Django में ऐप का नाम बदलने के लिए इन चरणों का पालन करें:

  1. उस फ़ोल्डर का नाम बदलें जो आपके प्रोजेक्ट रूट में है
  2. , उनके निर्भरता में अपने ऐप के सभी संदर्भ बदलें यानी एप्लिकेशन की views.py, urls.py'manage.py', और settings.pyफ़ाइलें।
  3. django_content_typeनिम्नलिखित आदेश के साथ डेटाबेस तालिका को संपादित करें :UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'
  4. यदि आपके पास मॉडल हैं, तो भी आपको मॉडल तालिकाओं का नाम बदलना होगा। पोस्टग्रैज उपयोग के लिए ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName। Mysql के लिए भी मुझे लगता है कि यह वही है (जैसा कि @null_radix द्वारा उल्लेख किया गया है)
  5. (Django के लिए = = 1.7) django_migrationsअपने पिछले माइग्रेशन को फिर से चलाने से बचने के लिए तालिका को अपडेट करें UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>':। नोट : कुछ बहस (टिप्पणियों में) है अगर यह कदम Django 1.8+ के लिए आवश्यक है; अगर किसी को यकीन है कि कृपया यहां अपडेट करें।
  6. यदि आपकी models.pyमेटा क्लास ने app_nameसूचीबद्ध किया है, तो उसका भी नाम बदलें (@will द्वारा उल्लेखित)।
  7. यदि आपने अपने ऐप के अंदर अपने staticया templatesफ़ोल्डरों को नामांकित किया है , तो आपको उन लोगों का नाम बदलना होगा। उदाहरण के लिए, नाम बदलने old_app/static/old_appके लिए new_app/static/new_app
  8. Django का नाम बदलने के लिए models, आपको django_content_type.nameDB में प्रविष्टि बदलनी होगी । PostgreSQL उपयोग के लिएUPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'

मेटा पॉइंट (यदि virtualenv का उपयोग कर रहे हैं): वर्थ नोटिंग, यदि आप उस निर्देशिका का नाम बदल रहे हैं जिसमें आपका virtualenv है, तो संभवतः आपके env में कई फाइलें होंगी जिनमें एक निरपेक्ष पथ होता है और इसे अपडेट करने की भी आवश्यकता होगी। यदि आपको ऐसी त्रुटियां मिल रही हैं, तो ImportError: No module named ...यह अपराधी हो सकता है। (इसे उपलब्ध कराने के लिए @danyamachine को धन्यवाद)।

अन्य संदर्भ: आप अधिक पूर्ण चित्र के लिए नीचे दिए गए लिंक को भी संदर्भित करना चाह सकते हैं

  1. Django और दक्षिण के साथ एक ऐप का नाम बदल रहा है
  2. मैं एक django ऐप से बाहर और एक नए मॉडल में माइग्रेट कैसे करूं?
  3. Django ऐप का नाम कैसे बदलें?
  4. Django दक्षिण के साथ पीछे की ओर प्रवास
  5. Django / दक्षिण का उपयोग कर एक मॉडल का नाम बदलने का सबसे आसान तरीका?
  6. उपरोक्त चरणों को स्वचालित करने के लिए पायथन कोड ( A.Raouf के लिए धन्यवाद ) ( अनटाइटेड कोड। आपको चेतावनी दी गई है)!
  7. उपरोक्त चरणों को स्वचालित करने के लिए अजगर कोड ( राफापोनीमैन के लिए धन्यवाद ) ( अनटाइटेड कोड। आपको चेतावनी दी गई है)!

3
यदि आपके पास मॉडल हैं, तो भी आपको मॉडल तालिकाओं का नाम बदलना होगा। पोस्टग्रेज उपयोग के लिए ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
null_radix

11
और यदि आप नए माइग्रेशन का उपयोग कर रहे हैं, तो आपको मौजूदा माइग्रेशन फ़ाइलों और django_migrations टेबल में ऐप का नाम बदलना होगा। यह बेहतर हो सकता है कि पहले माइग्रेशन स्क्वैश करें ताकि एडिट करने के लिए कम हो।
जेम्स

7
पोस्टग्रेज के लिए, यदि आप अनुक्रम का नाम बदलना चाहते हैं, तो उपयोग करें ALTER SEQUENCE <oldAppName>_<modelName>_<PK>_seq RENAME TO <newAppName>_<modelName>_<PK>_seq;। हालांकि यह आवश्यक नहीं है, सिस्टम स्वयं नाम के बारे में परवाह नहीं करता है। स्तंभ DEFAULT स्टोर करता है OID( 'foo_pkey_seq'::regclass), आप क्रम को बिना तोड़े उसका नाम बदल सकते हैं - OID वही रहता है।
कॉन्सटेंटाइन कालबाज़ोव

3
यदि आपने अपना उत्तर अपडेट करने के लिए जेम्स को माइग्रेशन फ़ाइलों (जैसे निर्भरता मॉड्यूल नाम) को अपग्रेड करने के बारे में शामिल किया है, तो बहुत अच्छा होगा ... यह पता नहीं लगा सका कि यह थोड़ा बहुत है।
u3l

2
यहां एक प्रबंधन आदेश दिया गया है जो मॉडल का नाम बदलने के लिए @ SrikarAppalaraju के समाधान के अनुसार नाम बदलने की अनुमति देता है: gist.github.com/rafaponieman/201054ddf725cda1e60be3fe845850a5 यह नए_name और वर्गों के रूप में स्वीकार करता है (सभी स्वरूपित के रूप में वे डेटाबेस तालिकाओं और क्षेत्रों पर दिखते हैं)।
राफापोनीमैन

32

Django 1.7 में नया एक ऐप रजिस्ट्री है जो कॉन्फ़िगरेशन को संग्रहीत करता है और आत्मनिरीक्षण प्रदान करता है। यह मशीनरी आपको कई ऐप विशेषताओं को बदलने देती है।

मुख्य बिंदु जो मैं बनाना चाहता हूं वह यह है कि किसी ऐप का नाम बदलना हमेशा आवश्यक नहीं होता है: ऐप कॉन्फ़िगरेशन के साथ परस्पर विरोधी ऐप्स को हल करना संभव है। लेकिन यह भी जाने का तरीका कि क्या आपके ऐप को फ्रेंडली नामकरण की जरूरत है।

एक उदाहरण के रूप में मैं अपने सर्वेक्षण ऐप का नाम 'उपयोगकर्ताओं से प्रतिक्रिया' चाहता हूं। यह इस प्रकार चलता है:

निर्देशिका apps.pyमें एक फ़ाइल बनाएँ polls:

from django.apps import AppConfig

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

अपने लिए डिफ़ॉल्ट ऐप कॉन्फिगर जोड़ें polls/__init__.py:

default_app_config = 'polls.apps.PollsConfig'

अधिक एप्लिकेशन कॉन्फ़िगरेशन के लिए: https://docs.djangoproject.com/en/1.7/ref/applications/


13

मज़ा समस्या! मुझे जल्द ही बहुत सारे ऐप का नाम बदलना है, इसलिए मैंने एक सूखा रन बनाया।

यह विधि परमाणु कदमों में प्रगति करने की अनुमति देती है, आपके द्वारा पुनर्नामित किए जा रहे ऐप पर काम करने वाले अन्य डेवलपर्स के लिए व्यवधान को कम करने के लिए।

वर्किंग उदाहरण कोड के लिए इस उत्तर के निचले भाग में लिंक देखें।

  1. इस कदम के लिए मौजूदा कोड तैयार करें :
    • एक एप्लिकेशन कॉन्फिग बनाएं (सेट करें nameऔर labelडिफॉल्ट्स के लिए)।
    • करने के लिए एप्लिकेशन जोड़ें INSTALLED_APPS
    • सभी मॉडलों पर, स्पष्ट रूप db_tableसे वर्तमान मूल्य पर सेट करें।
    • डॉक्टर का पलायन इसलिए कि db_table"हमेशा" स्पष्ट रूप से परिभाषित किया गया था।
    • सुनिश्चित करें कि किसी भी माइग्रेशन की आवश्यकता नहीं है (पिछले चरण की जांच)।
  2. एप्लिकेशन लेबल बदलें :

    • labelनए एप्लिकेशन नाम के लिए एप्लिकेशन कॉन्फ़िगरेशन में सेट करें ।
    • नए ऐप लेबल को संदर्भित करने के लिए माइग्रेशन और विदेशी कुंजियों को अपडेट करें।
    • सामान्य वर्ग-आधारित दृश्यों के लिए अपडेट टेम्प्लेट ( डिफ़ॉल्ट पथ है<app_label>/<model_name>_<suffix>.html )
    • माइग्रेशन और content_typesऐप को ठीक करने के लिए कच्ची SQL चलाएं (दुर्भाग्य से, कुछ कच्चे SQL अपरिहार्य है)। आप इसे माइग्रेशन में नहीं चला सकते।

      UPDATE django_migrations
         SET app = 'catalogue'
       WHERE app = 'shop';
      
      UPDATE django_content_type
         SET app_label = 'catalogue'
       WHERE app_label = 'shop';
    • सुनिश्चित करें कि किसी भी माइग्रेशन की आवश्यकता नहीं है (पिछले चरण की जांच)।

  3. तालिकाओं का नाम बदलें :
    • "कस्टम" निकालें db_table
    • भागो makemigrationsतो django "डिफ़ॉल्ट रूप से" तालिका का नाम बदल सकता है।
  4. फ़ाइलें स्थानांतरित करें :
    • मॉड्यूल निर्देशिका का नाम बदलें।
    • आयात ठीक करें।
    • अद्यतन अनुप्रयोग config है name
    • अद्यतन जहां INSTALLED_APPSएप्लिकेशन को संदर्भित करता है।
  5. सुव्यवस्थित करें :
    • यदि आवश्यक नहीं है, तो कस्टम ऐप कॉन्फिगरेशन निकालें।
    • यदि ऐप कॉन्फिगर हो गया है, तो इसे हटाना भी न भूलें INSTALLED_APPS

उदाहरण समाधान: मैंने ऐप-नाम बदला-उदाहरण बनाया है , एक उदाहरण परियोजना जहां आप देख सकते हैं कि मैंने एक ऐप का नाम कैसे बदला, एक समय में एक प्रतिबद्ध।

उदाहरण Python 2.7 और Django 1.8 का उपयोग करता है, लेकिन मुझे विश्वास है कि एक ही प्रक्रिया कम से कम Python 3.6 और Django 2.1 पर काम करेगी।


1
थैंक्स @meshy यह वास्तव में मुझे एक विशाल ऐप का नाम बदलने में मदद करता है। एक सुझाव, अंतिम माइग्रेशन को चलाने के बाद आप सभी माइग्रेशन फ़ाइलों को हटा सकते हैं और प्रारंभिक माइग्रेशन फ़ाइल को फिर से बना सकते हैं जो आपकी मदद करेगी यदि आप कोई निरंतर एकीकरण परीक्षण कर रहे हैं अन्यथा CI परीक्षण डेटाबेस बनाने में विफल रहेगा।
रोहन

मैंने इस प्रक्रिया के समाप्त होने के बाद से खरोंच से चलने योग्य होने की उम्मीद में यह लिखा था। यदि माइग्रेशन विफल हुआ, तो शायद हम में से कुछ चूक गए। मुझे इसके बारे में सोचना होगा, और देखना होगा कि क्या कोई और कदम है जो मुझे जोड़ना है।
मेशी

@ रोहन क्या कोई जानकारी है जो आप विस्तार से बता सकते हैं कि माइग्रेशन कैसे विफल हुआ?
मेशी

यदि आप पुराने माइग्रेशन फ़ाइलों के साथ स्थानीय रूप से परीक्षण चलाते हैं, तो आप देख सकते हैं कि यह सारणी बनाने में विफल रहेंगे @meshy
रोहन

1
इस गेम प्लान ने मेरे लिए पूरी तरह से काम किया। जब तक अगले चरण से निपटने से पहले प्रत्येक चरण को सभी सक्रिय चेकआउट (सीआई, अन्य देव, उत्पादन, आदि) के माध्यम से तैनात किया जाता है, तब तक यह पूरी तरह से काम करता है - मौजूदा ऐतिहासिक पलायन के साथ कोई समस्या नहीं। निम्न चरणों में जाने से पहले चरणों को क्रम से करें, और हर जगह परिवर्तनों का प्रचार करें।
user85461

11

यदि आप PyCharm का उपयोग कर रहे हैं और परियोजना का नाम बदलने के बाद काम करना बंद कर देता है:

  1. रन रन / डिबग कॉन्फ़िगरेशन संपादित करें और पर्यावरण चर DJANGO_SETTINGS_MODULE को बदलें, क्योंकि इसमें आपका प्रोजेक्ट नाम शामिल है।
  2. सेटिंग्स / भाषा और फ्रेमवर्क / Django पर जाएं और सेटिंग्स फ़ाइल स्थान को अपडेट करें।

1
यह उन स्थितियों में से एक है जहां मुझे खोजने और बदलने में विफल रहा। इस पर ध्यान दिलाने के लिए धन्यवाद।
21

0

क्लीनर प्लेट के लिए पुनः माइग्रेट दृष्टिकोण।

यह दर्द रहित रूप से किया जा सकता है यदि अन्य ऐप का नाम बदलने के लिए ऐप से विदेशी प्रमुख मॉडल नहीं हैं। जाँच करें और सुनिश्चित करें कि उनकी माइग्रेशन फ़ाइलें इस से किसी भी माइग्रेशन को सूचीबद्ध नहीं करती हैं।

  1. अपने डेटाबेस का बैकअप लें। सभी तालिकाओं को संभव सर्कुलर निर्भरताओं के लिए a) डेटा + स्कीमा के साथ डंप करें, और b) पुनः लोड करने के लिए केवल डेटा।
  2. अपने परीक्षण चलाएं।
  3. VCS में सभी कोड की जाँच करें।
  4. नाम बदला जा करने के लिए एप्लिकेशन के डेटाबेस तालिकाओं को हटा दें।
  5. अनुमतियाँ हटाएं: delete from auth_permission where content_type_id in (select id from django_content_type where app_label = '<OldAppName>')
  6. सामग्री प्रकार हटाएं: delete from django_content_type where app_label = '<OldAppName>'
  7. एप्लिकेशन के फ़ोल्डर का नाम बदलें।
  8. , उनके निर्भरता में अपने ऐप के सभी संदर्भ बदलें यानी एप्लिकेशन की views.py, urls.py'manage.py', और settings.pyफ़ाइलें।
  9. माइग्रेशन हटाएं: delete from django_migrations where app = '<OldAppName>'
  10. यदि आपकी models.pyमेटा क्लास ने app_nameसूचीबद्ध किया है, तो उसका भी नाम बदलें (@will द्वारा उल्लेखित)।
  11. यदि आपने अपने ऐप के अंदर अपने staticया templatesफ़ोल्डरों को नामांकित किया है , तो आपको उन लोगों का नाम बदलना होगा। उदाहरण के लिए, नाम बदलने old_app/static/old_appके लिए new_app/static/new_app
  12. यदि आपने apps.py में app config परिभाषित किया है; उन का नाम बदलें, और सेटिंग्स में उनके संदर्भ का नाम बदलें ।INSTALLED_APPS
  13. माइग्रेशन फ़ाइलें हटाएं।
  14. पुनः माइग्रेशन करें, और माइग्रेट करें।
  15. बैकअप से अपना टेबल डेटा लोड करें।

0

आप का उपयोग करते हैं Pycharm , कोई एप्लिकेशन का नाम बदलने के साथ बहुत आसान है पुनर्रचना ( Shift+ F6सभी परियोजना फ़ाइलों के लिए डिफ़ॉल्ट)।
लेकिन सुनिश्चित करें कि आप __pycache__प्रोजेक्ट डायरेक्टरी और उसके उप-निर्देशिका में फ़ोल्डर्स को हटा दें । साथ ही सावधान रहें क्योंकि यह उन टिप्पणियों का भी नाम बदल देता है, जिन्हें आप रिफ्लेक्टर प्रीव्यू विंडो में शामिल कर सकते हैं।
और आपको OldNameConfig (AppConfig) का नाम बदलना होगा: apps.pyइसके अलावा आपके नाम बदले हुए ऐप में।

यदि आप अपने डेटाबेस का डेटा नहीं खोना चाहते हैं, तो आपको पूर्वोक्त उत्तर जैसे डेटाबेस में क्वेरी के साथ मैन्युअल रूप से करना होगा।


-3

सिर्फ विकल्प खोजें और प्रतिस्थापित क्यों न करें। (हर कोड संपादक के पास है)?

उदाहरण के लिए विज़ुअल स्टूडियो कोड (एडिट विकल्प के तहत):

विजुअल स्टूडियो कोड विकल्प: 'फाइलों में बदलें'

आप बस पुराने नाम और नए नाम में टाइप करते हैं और प्रोजेक्ट में हर क्लिक को एक क्लिक से बदल देते हैं।

नोट : यह केवल फ़ाइल सामग्री, फ़ाइल और फ़ोल्डर नामों का नाम नहीं देता है। फ़ोल्डर का नाम बदलना न भूलें, उदाहरण के लिए। templates/my_app_name/इसका नाम बदल दियाtemplates/my_app_new_name/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.