Làm cách nào để thay đổi tên của ứng dụng Django?


156

Tôi đã thay đổi tên của một ứng dụng trong Django bằng cách đổi tên thư mục, nhập và tất cả các tham chiếu của nó (mẫu / chỉ mục). Nhưng bây giờ tôi gặp lỗi này khi tôi cố chạypython manage.py runserver

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

Làm thế nào tôi có thể gỡ lỗi và giải quyết lỗi này? Bất kì manh mối nào?


Chào danihp. Vâng tôi có. Tôi cũng đang sử dụng virtualenv, tôi không biết điều đó có liên quan gì không.
André

1
Nếu, dù sao đi nữa, bạn đang sử dụng PyCharm, renametính năng của nó sẽ giúp bạn rất nhiều trong việc này.
Anto

1
Không phải Nam đang hỗ trợ hoạt động như vậy sao?
andilabs

Câu trả lời:


285

Thực hiện theo các bước sau để thay đổi tên ứng dụng trong Django:

  1. Đổi tên thư mục trong thư mục gốc của dự án của bạn
  2. Thay đổi bất kỳ tài liệu tham khảo để ứng dụng của bạn trong sự phụ thuộc của họ, tức là của ứng dụng views.py, urls.py, 'manage.py', và settings.pytập tin.
  3. Chỉnh sửa bảng cơ sở dữ liệu django_content_typebằng lệnh sau:UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'
  4. Ngoài ra nếu bạn có các mô hình, bạn sẽ phải đổi tên các bảng mô hình. Đối với sử dụng postgres ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName. Đối với mysql cũng vậy, tôi nghĩ nó giống nhau (như được đề cập bởi @null_radix)
  5. (Đối với Django> = 1.7) Cập nhật django_migrationsbảng để tránh việc di chuyển trước đó của bạn chạy lại : UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>'. Lưu ý : có một số tranh luận (trong các bình luận) nếu bước này là bắt buộc đối với Django 1.8+; Nếu ai đó biết chắc chắn xin vui lòng cập nhật ở đây.
  6. Nếu models.pylớp Meta của bạn đã app_nameđược liệt kê, hãy đảm bảo đổi tên nó (được đề cập bởi @will).
  7. Nếu bạn đã đặt tên cho các thư mục statichoặc templatesthư mục trong ứng dụng của mình, bạn cũng cần đổi tên chúng. Ví dụ, đổi tên old_app/static/old_appthành new_app/static/new_app.
  8. Để đổi tên django models, bạn sẽ cần thay đổi django_content_type.namemục nhập trong DB. Để sử dụng postgreSQLUPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'

Meta point (Nếu sử dụng virtualenv): Đáng chú ý, nếu bạn đổi tên thư mục chứa virtualenv của mình, có thể sẽ có một số tệp trong env của bạn chứa đường dẫn tuyệt đối và cũng sẽ cần được cập nhật. Nếu bạn đang gặp lỗi như thế ImportError: No module named ...này có thể là thủ phạm. (cảm ơn @danyamachine đã cung cấp cái này).

Các tài liệu tham khảo khác: bạn cũng có thể muốn tham khảo các liên kết dưới đây để có bức tranh hoàn chỉnh hơn

  1. Đổi tên một ứng dụng với Django và South
  2. Làm cách nào để di chuyển một mô hình ra khỏi một ứng dụng django và sang một ứng dụng mới?
  3. Làm cách nào để thay đổi tên của ứng dụng Django?
  4. Di cư ngược với Django South
  5. Cách dễ nhất để đổi tên một mô hình bằng Django / South?
  6. Mã Python (nhờ A.Raouf ) để tự động hóa các bước trên (Mã chưa được kiểm tra. Bạn đã được cảnh báo!)
  7. Mã Python (nhờ rafaponieman ) để tự động hóa các bước trên (Mã chưa được kiểm tra. Bạn đã được cảnh báo!)

3
Ngoài ra nếu bạn có các mô hình, bạn sẽ phải đổi tên các bảng mô hình. Để sử dụng postgres ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
null_radix

11
Và nếu bạn đang sử dụng các lần di chuyển mới, bạn sẽ cần thay đổi tên ứng dụng trong các tệp di chuyển hiện có và bảng django_migations. Có thể tốt hơn để xóa sổ di chuyển trước để có ít chỉnh sửa hơn.
James

7
Đối với Postgres, nếu bạn cũng muốn đổi tên chuỗi, thì hãy sử dụng ALTER SEQUENCE <oldAppName>_<modelName>_<PK>_seq RENAME TO <newAppName>_<modelName>_<PK>_seq;. Mặc dù không cần thiết nhưng bản thân hệ thống không quan tâm đến tên. Cột DEFAULT lưu trữ một OID( 'foo_pkey_seq'::regclass), bạn có thể thay đổi tên của chuỗi mà không phá vỡ điều đó - OID giữ nguyên.
Konstantine Kalbazov

3
Sẽ thật tuyệt nếu bạn cập nhật câu trả lời của mình để bao gồm những gì James nói về việc nâng cấp các tệp di chuyển (chẳng hạn như tên mô-đun phụ thuộc) ... không thể tìm ra điều đó một chút.
u3l

2
Đây là một lệnh quản lý cho phép đổi tên mô hình theo giải pháp của @ SrikarAppalaraju: gist.github.com/rafaponieman/201054ddf725cda1e60be3fe845850a5 Nó chấp nhận các trường cơ sở dữ liệu cũ và các định dạng (tất cả đều được định dạng trên các bảng).
rafaponieman

32

Mới trong Django 1.7 là một sổ đăng ký ứng dụng lưu trữ cấu hình và cung cấp nội quan. Máy móc này cho phép bạn thay đổi một số thuộc tính ứng dụng.

Điểm chính tôi muốn thực hiện là việc đổi tên một ứng dụng không phải lúc nào cũng cần thiết: Với cấu hình ứng dụng, có thể giải quyết các ứng dụng xung đột. Nhưng cũng là cách để đi nếu ứng dụng của bạn cần đặt tên thân thiện.

Để làm ví dụ tôi muốn đặt tên cho ứng dụng thăm dò ý kiến ​​của mình 'Phản hồi từ người dùng'. Nó như thế này:

Tạo một apps.pytập tin trong pollsthư mục:

from django.apps import AppConfig

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

Thêm cấu hình ứng dụng mặc định vào polls/__init__.py:

default_app_config = 'polls.apps.PollsConfig'

Để biết thêm cấu hình ứng dụng: https://docs.djangoproject.com/en/1.7/ref/appluggest/


13

Vấn đề thú vị! Tôi sẽ phải đổi tên rất nhiều ứng dụng sớm, vì vậy tôi đã chạy nhanh.

Phương pháp này cho phép tiến trình được thực hiện theo các bước nguyên tử, để giảm thiểu gián đoạn cho các nhà phát triển khác làm việc trên ứng dụng mà bạn đổi tên.

Xem liên kết ở dưới cùng của câu trả lời này để biết mã ví dụ làm việc.

  1. Chuẩn bị mã hiện có để di chuyển :
    • Tạo cấu hình ứng dụng (đặt namelabelmặc định).
    • Thêm cấu hình ứng dụng vào INSTALLED_APPS.
    • Trên tất cả các mô hình, được đặt rõ ràng thành db_tablegiá trị hiện tại.
    • Bác sĩ di cư sao cho db_table"luôn luôn" được xác định rõ ràng.
    • Đảm bảo không di chuyển được yêu cầu (kiểm tra bước trước).
  2. Thay đổi nhãn ứng dụng :

    • Đặt labelcấu hình ứng dụng thành tên ứng dụng mới.
    • Cập nhật di chuyển và khóa ngoại để tham khảo nhãn ứng dụng mới.
    • Cập nhật các mẫu cho các khung nhìn dựa trên lớp chung ( đường dẫn mặc định là<app_label>/<model_name>_<suffix>.html )
    • Chạy SQL thô để sửa lỗi di chuyển và content_typesứng dụng (thật không may, một số SQL thô là không thể tránh khỏi). Bạn không thể chạy cái này trong một di chuyển.

      UPDATE django_migrations
         SET app = 'catalogue'
       WHERE app = 'shop';
      
      UPDATE django_content_type
         SET app_label = 'catalogue'
       WHERE app_label = 'shop';
    • Đảm bảo không di chuyển được yêu cầu (kiểm tra bước trước).

  3. Đổi tên các bảng :
    • Xóa "tùy chỉnh" db_table.
    • Chạy makemigrationsđể django có thể đổi tên bảng "thành mặc định".
  4. Di chuyển các tập tin :
    • Đổi tên thư mục mô-đun.
    • Sửa lỗi nhập khẩu.
    • Cập nhật cấu hình ứng dụng name.
    • Cập nhật nơi INSTALLED_APPStham chiếu cấu hình ứng dụng.
  5. Dọn dẹp :
    • Xóa cấu hình ứng dụng tùy chỉnh nếu không còn cần thiết.
    • Nếu cấu hình ứng dụng không còn, đừng quên xóa nó khỏi INSTALLED_APPS.

Giải pháp ví dụ: Tôi đã tạo ví dụ đổi tên ứng dụng , một dự án ví dụ nơi bạn có thể thấy cách tôi đổi tên một ứng dụng, mỗi lần một cam kết.

Ví dụ sử dụng Python 2.7 và Django 1.8, nhưng tôi tin rằng quy trình tương tự sẽ hoạt động trên ít nhất Python 3.6 và Django 2.1.


1
Cảm ơn @meshy. Nó thực sự giúp tôi đổi tên một ứng dụng khổng lồ. Một đề xuất, sau khi chạy lần di chuyển cuối cùng, bạn có thể xóa tất cả các tệp di chuyển và tạo lại tệp di chuyển ban đầu sẽ giúp bạn nếu bạn thực hiện bất kỳ kiểm tra tích hợp liên tục nào nếu không CI sẽ không tạo được cơ sở dữ liệu kiểm tra.
Rohan

Tôi đã viết điều này với hy vọng việc di chuyển có thể chạy được từ đầu sau khi quá trình kết thúc. Nếu việc di chuyển thất bại, có lẽ một trong số chúng ta đã bỏ lỡ điều gì đó. Tôi sẽ suy nghĩ về nó, và xem nếu có bất kỳ bước nào khác tôi cần thêm.
lưới

@Rohan có bất kỳ thông tin nào bạn có thể cung cấp để chi tiết chính xác làm thế nào việc di chuyển thất bại?
lưới

Nếu bạn chạy thử nghiệm cục bộ với các tệp di chuyển cũ, bạn có thể thấy nó sẽ thất bại trong việc tạo các bảng @meshy
Rohan

1
Kế hoạch trò chơi này làm việc hoàn hảo cho tôi. Miễn là mỗi bước được triển khai thông qua tất cả các kiểm tra hoạt động (CI, các nhà phát triển khác, sản xuất, v.v.) trước khi bước tiếp theo được xử lý, nó hoạt động hoàn hảo - không có vấn đề gì với việc di chuyển lịch sử hiện tại. Thực hiện các bước theo thứ tự và tuyên truyền các thay đổi ở mọi nơi trước khi chuyển sang bước sau.
dùng85461

11

Trong trường hợp bạn đang sử dụng PyCharm và dự án ngừng hoạt động sau khi đổi tên:

  1. Chỉnh sửa cấu hình Run / Debug và thay đổi biến môi trường DJANGO_SETTINGS_MODULE, vì nó bao gồm tên dự án của bạn.
  2. Chuyển đến Cài đặt / Ngôn ngữ & Khung / Django và cập nhật vị trí tệp cài đặt.

1
Đây là một trong những tình huống mà tôi tìm và thay thế thất bại. Cảm ơn đã chỉ ra điều này.
ruaanvds

0

Tiếp cận lại di chuyển cho một tấm sạch hơn.

Điều này có thể được thực hiện một cách dễ dàng NẾU các ứng dụng khác không phải là mô hình khóa ngoại từ ứng dụng được đổi tên. Kiểm tra và đảm bảo các tệp di chuyển của họ không liệt kê bất kỳ di chuyển nào từ tệp này.

  1. Sao lưu cơ sở dữ liệu của bạn. Kết xuất tất cả các bảng với a) dữ liệu + lược đồ cho các phụ thuộc vòng tròn có thể và b) chỉ dữ liệu để tải lại.
  2. Chạy thử nghiệm của bạn.
  3. Kiểm tra tất cả mã vào VCS.
  4. Xóa các bảng cơ sở dữ liệu của ứng dụng sẽ được đổi tên.
  5. Xóa các quyền: delete from auth_permission where content_type_id in (select id from django_content_type where app_label = '<OldAppName>')
  6. Xóa các loại nội dung: delete from django_content_type where app_label = '<OldAppName>'
  7. Đổi tên thư mục của ứng dụng.
  8. Thay đổi bất kỳ tài liệu tham khảo để ứng dụng của bạn trong sự phụ thuộc của họ, tức là của ứng dụng views.py, urls.py, 'manage.py', và settings.pytập tin.
  9. Xóa di chuyển: delete from django_migrations where app = '<OldAppName>'
  10. Nếu models.pylớp Meta của bạn đã app_nameđược liệt kê, hãy đảm bảo đổi tên nó (được đề cập bởi @will).
  11. Nếu bạn đã đặt tên cho các thư mục statichoặc templatesthư mục trong ứng dụng của mình, bạn cũng cần đổi tên chúng. Ví dụ, đổi tên old_app/static/old_appthành new_app/static/new_app.
  12. Nếu bạn đã xác định cấu hình ứng dụng trong apps.py; đổi tên chúng và đổi tên các tham chiếu của chúng trong cài đặt.INSTALLED_APPS
  13. Xóa các tập tin di chuyển.
  14. Làm lại di chuyển, và di chuyển.
  15. Tải dữ liệu bảng của bạn từ bản sao lưu.

0

Nếu bạn sử dụng Pycharm , việc đổi tên một ứng dụng rất dễ dàng với tái cấu trúc ( Shift+ F6mặc định) cho tất cả các tệp dự án.
Nhưng hãy chắc chắn rằng bạn xóa các __pycache__thư mục trong thư mục dự án & thư mục con của nó. Ngoài ra, hãy cẩn thận vì nó cũng đổi tên các bình luận mà bạn có thể loại trừ trong cửa sổ xem trước cấu trúc lại nó sẽ hiển thị cho bạn.
Và bạn sẽ phải đổi tên OldNameConfig (AppConfig): trongapps.py ứng dụng đã đổi tên của bạn.

Nếu bạn không muốn mất dữ liệu của cơ sở dữ liệu của mình, bạn sẽ phải thực hiện thủ công với truy vấn trong cơ sở dữ liệu như câu trả lời đã nói ở trên.


-3

Tại sao không chỉ sử dụng tùy chọn Tìm và Thay thế. (mỗi trình soạn thảo mã có nó)?

Ví dụ: Visual Studio Code (bên dưới tùy chọn Chỉnh sửa):

Tùy chọn Visual Studio Code: 'Thay thế trong tệp'

Bạn chỉ cần gõ tên cũ và tên mới và thay thế mọi thứ trong dự án bằng một cú nhấp chuột.

LƯU Ý : Điều này chỉ đổi tên nội dung tệp, KHÔNG phải tên tệp và thư mục. Đừng quên đổi tên thư mục, vd. templates/my_app_name/đổi tên thànhtemplates/my_app_new_name/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.