จะเปลี่ยนชื่อแอพ Django ได้อย่างไร?


156

ฉันเปลี่ยนชื่อแอพใน Django ด้วยการเปลี่ยนชื่อโฟลเดอร์การนำเข้าและการอ้างอิงทั้งหมด (เทมเพลต / ดัชนี) แต่ตอนนี้ฉันได้รับข้อผิดพลาดนี้เมื่อฉันพยายามเรียกใช้python manage.py runserver

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

ฉันจะดีบักและแก้ไขข้อผิดพลาดนี้ได้อย่างไร เบาะแสใด ๆ


สวัสดี danihp ใช่ฉันมี. ฉันยังใช้ virtualenv ด้วยฉันไม่รู้ถ้านั่นมีบางอย่างเกี่ยวข้อง
André

1
หากมีโอกาสที่คุณกำลังใช้ PyCharm renameคุณสมบัติของมันจะช่วยคุณได้อย่างมาก
Anto

1
เซาท์ไม่สนับสนุนการดำเนินการดังกล่าวหรือไม่
andilabs

คำตอบ:


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สำหรับการใช้งาน postgres สำหรับ mysql เช่นกันฉันคิดว่ามันเหมือนกัน (ตามที่ระบุโดย @null_radix)
  5. (สำหรับ Django> = 1.7) อัพเดทdjango_migrationsตารางเพื่อหลีกเลี่ยงการโยกย้ายก่อนหน้าของคุณ UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>'re-run: หมายเหตุ : มีการถกเถียง (ในความคิดเห็น) หากขั้นตอนนี้จำเป็นสำหรับ Django 1.8+; หากมีคนรู้แน่นอนโปรดอัปเดตที่นี่
  6. หากmodels.pyรายการ Meta Class ของคุณapp_nameอยู่ในรายการตรวจสอบให้แน่ใจว่าได้เปลี่ยนชื่อนั้นแล้วเช่นกัน (โดย @will)
  7. หากคุณตั้งชื่อstaticหรือtemplatesโฟลเดอร์ของคุณในแอพคุณจะต้องเปลี่ยนชื่อเหล่านั้นด้วย ตัวอย่างเช่นเปลี่ยนชื่อไปold_app/static/old_appnew_app/static/new_app
  8. สำหรับการเปลี่ยนชื่อ django modelsคุณจะต้องเปลี่ยนdjango_content_type.nameรายการใน DB สำหรับการใช้ postgreSQLUPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'

Meta point (หากใช้ virtualenv):ถ้าคุณเปลี่ยนชื่อไดเรกทอรีที่มี virtualenv ของคุณน่าจะมีหลายไฟล์ใน env ของคุณที่มีเส้นทางที่แน่นอนและจะต้องได้รับการปรับปรุงด้วย หากคุณได้รับข้อผิดพลาดเช่นImportError: No module named ...นี้อาจเป็นผู้ร้าย (ขอบคุณ @danyamachine ที่ให้สิ่งนี้)

ข้อมูลอ้างอิงอื่น ๆ :คุณอาจต้องการอ้างอิงลิงค์ด้านล่างเพื่อภาพที่สมบูรณ์ยิ่งขึ้น

  1. การเปลี่ยนชื่อแอปด้วย Django และ South
  2. ฉันจะย้ายโมเดลจากแอพ django หนึ่งแอปและไปยังแอปใหม่ได้อย่างไร
  3. จะเปลี่ยนชื่อแอพ Django ได้อย่างไร?
  4. การโยกย้ายไปข้างหลังด้วย Django South
  5. วิธีที่ง่ายที่สุดในการเปลี่ยนชื่อรุ่นโดยใช้ Django / South?
  6. รหัส Python (ขอบคุณA.Raouf ) เพื่อทำตามขั้นตอนข้างต้นโดยอัตโนมัติ (ไม่ได้ทดสอบรหัสคุณถูกเตือนแล้ว!)
  7. รหัส Python (ขอบคุณrafaponieman ) เพื่อทำตามขั้นตอนข้างต้นโดยอัตโนมัติ (ไม่ได้ทดสอบรหัสคุณถูกเตือนแล้ว!)

3
นอกจากนี้หากคุณมีโมเดลคุณจะต้องเปลี่ยนชื่อตารางโมเดล สำหรับ postgres ให้ใช้ ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
null_radix

11
และหากคุณใช้การย้ายข้อมูลใหม่คุณจะต้องเปลี่ยนชื่อแอพในไฟล์การย้ายข้อมูลที่มีอยู่และตาราง django_migrations การสควอชการโยกย้ายอาจจะดีกว่าหากมีการแก้ไขน้อยกว่า
James

7
สำหรับ Postgres ALTER SEQUENCE <oldAppName>_<modelName>_<PK>_seq RENAME TO <newAppName>_<modelName>_<PK>_seq;ถ้าคุณต้องการเปลี่ยนชื่อลำดับเกินไปแล้วใช้ แม้ว่ามันจะไม่จำเป็น แต่ตัวระบบเองก็ไม่สนใจชื่อ คอลัมน์ DEFAULT จัดเก็บOID( 'foo_pkey_seq'::regclass) คุณสามารถเปลี่ยนชื่อของลำดับโดยไม่ทำลายซึ่ง OID จะยังคงเหมือนเดิม
Konstantine Kalbazov

3
คงจะดีมากถ้าคุณอัพเดทคำตอบเพื่อรวมสิ่งที่เจมส์พูดเกี่ยวกับการอัปเกรดไฟล์การโยกย้าย(เช่นชื่อโมดูลการพึ่งพา) ... ไม่สามารถหาคำตอบได้
u3l

2
นี่คือคำสั่งการจัดการที่อนุญาตให้เปลี่ยนชื่อรุ่นตามวิธีแก้ปัญหาของ @ SrikarAppalaraju: gist.github.com/rafaponieman/201054ddf725cda1e60be3fe845850a5 โดยยอมรับว่า old_name, new_name และคลาสเป็นพารามิเตอร์
rafaponieman

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 )
    • เรียกใช้ SQL ดิบเพื่อแก้ไขการโยกย้ายและcontent_typesแอป (น่าเสียดายที่ 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. ย้ายไฟล์ :
    • เปลี่ยนชื่อไดเรกทอรีโมดูล
    • แก้ไขการนำเข้า
    • nameอัปเดตแอปการตั้งค่าของ
    • อัปเดตตำแหน่งที่INSTALLED_APPSอ้างอิงการกำหนดค่าแอป
  5. เรียบร้อยขึ้น :
    • ลบการกำหนดค่าแอปที่กำหนดเองหากไม่ต้องการอีกต่อไป
    • หากการกำหนดค่าแอพหายไปอย่าลืมลบออกINSTALLED_APPSด้วย

โซลูชันตัวอย่าง:ฉันได้สร้างแอป - เปลี่ยนชื่อตัวอย่างโครงการตัวอย่างที่คุณสามารถดูว่าฉันเปลี่ยนชื่อแอปหนึ่งครั้งได้กระทำ

ตัวอย่างนี้ใช้ Python 2.7 และ Django 1.8 แต่ฉันมั่นใจว่ากระบวนการเดียวกันจะทำงานอย่างน้อย Python 3.6 และ Django 2.1


1
ขอบคุณ @ meeshy มันช่วยให้ฉันเปลี่ยนชื่อแอปขนาดใหญ่ได้ หนึ่งข้อเสนอแนะหลังจากใช้การโยกย้ายครั้งสุดท้ายคุณสามารถลบไฟล์การโยกย้ายทั้งหมดและสร้างไฟล์การโยกย้ายเริ่มต้นใหม่ซึ่งจะช่วยคุณหากคุณทำการทดสอบการรวมต่อเนื่องมิฉะนั้น CI จะล้มเหลวในการสร้างฐานข้อมูลการทดสอบ
Rohan

ฉันเขียนสิ่งนี้ในความคาดหวังของการย้ายข้อมูลที่สามารถรันได้ตั้งแต่เริ่มต้นเมื่อกระบวนการเสร็จสิ้น หากการโยกย้ายล้มเหลวบางทีเราอาจพลาดบางสิ่ง ฉันจะคิดเกี่ยวกับมันและดูว่ามีขั้นตอนอื่น ๆ ที่ฉันต้องเพิ่ม
meshy

@Rohan มีข้อมูลใดที่คุณสามารถให้รายละเอียดได้อย่างแม่นยำว่าการโยกย้ายล้มเหลวอย่างไร
meshy

หากคุณรันการทดสอบแบบโลคัลด้วยไฟล์การโอนย้ายระบบแบบเก่าคุณสามารถดูได้ว่าจะไม่สามารถสร้างตาราง @meshy ได้
Rohan

1
แผนเกมนี้ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน ตราบใดที่มีการปรับใช้แต่ละขั้นตอนผ่านการชำระเงินที่ใช้งานอยู่ทั้งหมด (CI, devs อื่น ๆ , การผลิต ฯลฯ ) ก่อนที่จะจัดการกับขั้นตอนถัดไปมันทำงานได้อย่างสมบูรณ์แบบ - ไม่มีปัญหากับการโยกย้ายประวัติที่มีอยู่ ทำตามลำดับและเผยแพร่การเปลี่ยนแปลงทุกที่ก่อนที่จะย้ายไปยังขั้นตอนต่อไปนี้
user85461

11

ในกรณีที่คุณใช้ PyCharm และโครงการหยุดทำงานหลังจากเปลี่ยนชื่อ:

  1. แก้ไขการกำหนดค่า Run / Debug และตัวแปรสภาพแวดล้อมการเปลี่ยนแปลง DJANGO_SETTINGS_MODULE เนื่องจากมีชื่อโครงการของคุณ
  2. ไปที่การตั้งค่า / ภาษาและกรอบ / Django และอัปเดตตำแหน่งไฟล์การตั้งค่า

1
นี่คือหนึ่งในสถานการณ์เหล่านั้นที่การค้นหาและแทนที่ล้มเหลวฉัน ขอบคุณที่ชี้นำสิ่งนี้
ruaanvds

0

โยกย้ายแนวทางสำหรับแผ่นทำความสะอาด

สิ่งนี้สามารถทำได้อย่างไม่ลำบากหากแอปอื่น ๆ ไม่ใช่รุ่นคีย์ต่างประเทศจากแอปที่จะเปลี่ยนชื่อ ตรวจสอบและตรวจสอบให้แน่ใจว่าไฟล์การโยกย้ายไม่แสดงรายการการย้ายข้อมูลใด ๆ จากไฟล์นี้

  1. สำรองฐานข้อมูลของคุณ ดัมพ์ตารางทั้งหมดด้วย a) data + schema สำหรับการขึ้นต่อกันแบบวงกลมที่เป็นไปได้และ 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รายการ Meta Class ของคุณapp_nameอยู่ในรายการตรวจสอบให้แน่ใจว่าได้เปลี่ยนชื่อนั้นแล้วเช่นกัน (โดย @will)
  11. หากคุณตั้งชื่อstaticหรือtemplatesโฟลเดอร์ของคุณในแอพคุณจะต้องเปลี่ยนชื่อเหล่านั้นด้วย ตัวอย่างเช่นเปลี่ยนชื่อไปold_app/static/old_appnew_app/static/new_app
  12. หากคุณกำหนดค่าแอปใน apps.py; เปลี่ยนชื่อเหล่านั้นและเปลี่ยนชื่อการอ้างอิงในการตั้งค่า INSTALLED_APPS
  13. ลบไฟล์การโยกย้าย
  14. ทำการโยกย้ายอีกครั้งและโยกย้าย
  15. โหลดข้อมูลตารางของคุณจากการสำรองข้อมูล

0

หากคุณใช้Pycharm การเปลี่ยนชื่อแอปนั้นง่ายมากด้วยการเปลี่ยนโครงสร้างใหม่ ( Shift+ F6ค่าเริ่มต้น) สำหรับไฟล์โครงการทั้งหมด
แต่ให้แน่ใจว่าคุณลบ__pycache__โฟลเดอร์ในไดเรกทอรีโครงการและไดเรกทอรีย่อย ระวังด้วยเพราะจะเปลี่ยนชื่อความคิดเห็นด้วยซึ่งคุณสามารถยกเว้นในหน้าต่างแสดงตัวอย่าง refactor มันจะแสดงให้คุณเห็น
และคุณจะต้องเปลี่ยนชื่อ OldNameConfig (AppConfig): ในapps.pyแอปที่เปลี่ยนชื่อของคุณเพิ่มเติม

หากคุณไม่ต้องการสูญเสียข้อมูลของฐานข้อมูลของคุณคุณจะต้องทำมันเองด้วยแบบสอบถามในฐานข้อมูลเช่นคำตอบดังกล่าว


-3

ทำไมไม่ใช้ตัวเลือกค้นหาและแทนที่ (ทุกตัวแก้ไขรหัสมี)

ตัวอย่างเช่นรหัส Visual Studio (ภายใต้ตัวเลือกการแก้ไข):

ตัวเลือก Visual Studio Code: 'แทนที่ในไฟล์'

คุณเพียงพิมพ์ชื่อเก่าและชื่อใหม่และแทนที่ทุกสิ่งในโครงการด้วยการคลิกเพียงครั้งเดียว

หมายเหตุ : นี่จะเปลี่ยนชื่อเนื้อหาไฟล์เท่านั้นไม่ใช่ชื่อไฟล์และโฟลเดอร์ อย่าลืมเปลี่ยนชื่อโฟลเดอร์เช่น templates/my_app_name/เปลี่ยนชื่อเป็นtemplates/my_app_new_name/

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.