2009-12-10 33 views
20

Đây là một câu hỏi mẫu django khá đơn giản. Mã người quản lý của tôi thường sống trong models.py, nhưng điều gì sẽ xảy ra khi models.py thực sự rất lớn? Có bất kỳ mẫu thay thế nào khác để cho phép mã người quản lý của bạn sống trong models.py để bảo trì và tránh nhập khẩu vòng tròn không?Mã django nên ở đâu?

Một câu hỏi có thể được hỏi là tại sao models.py quá lớn, nhưng hãy giả sử kích thước và bề rộng của tiện ích là hợp lý.

Trả lời

21

Tôi muốn giữ mô hình của mình trong models.py và người quản lý trong managers.py (biểu mẫu trong forms.py) tất cả trong cùng một ứng dụng. Đối với những người quản lý chung hơn, tôi thích giữ chúng trong core.managers nếu chúng có thể được sử dụng lại cho các ứng dụng khác. Trong một số ứng dụng lớn hơn của chúng tôi với các mô hình/modelname.py sẽ chứa trình quản lý và mã mô hình không có vẻ xấu.

+1

Làm cách nào để bạn xử lý sạch sẽ models.py cần nhập managers.py và ngược lại? – Jeff

+24

managers.py không cần nhập mô hình - mô hình được đề cập sẽ luôn có sẵn dưới dạng 'self.model' trên trình quản lý. – jacobian

+5

Thật tuyệt ... trừ khi QuerySet của người quản lý cần tham chiếu một mô hình khác - thì bạn không thể nhập mô hình đó và phải đặt mô hình đó trong models.py (ví dụ: nếu bạn loại trừ các mục tồn tại trong một mô hình khác, v.v.). –

3

Những gì tôi đã làm khi xây dựng ứng dụng Django là tạo tệp [modelname] .py chỉ với mã mô hình cụ thể, mã người quản lý và đôi khi tạo mã và sử dụng tệp __init__.py để nhập sau đó tất cả trong thư mục mô hình. Điều này đã giúp tôi ít nhất trong việc giữ cho nó có thể quản lý được.

+0

Nếu tôi định làm điều này, tôi sẽ đặt tất cả các tệp này trong thư mục 'mô hình'. Nó sẽ giữ cho các ứng dụng gốc sạch sẽ và tổ chức nhập khẩu tốt hơn. – jangeador

6

Tôi luôn đặt mỏ trong managers.py. Nếu bạn có vấn đề nhập vòng tròn hãy nhớ rằng a) Bạn có thể tham khảo lớp mô hình cho người quản lý tại self.model và b) Bạn có thể nhập khẩu bên trong các hàm.

+0

+1 để nhắc nhở chúng tôi rằng bạn có thể nhập bên trong một hàm. Trong trường hợp của tôi, tôi đã phải sử dụng một mô hình bên ngoài cho người quản lý của mình và tôi đã thêm '' apps.get_model (app_label = 'app_name', model_name = 'model_name') '' vào bên trong phương thức – jangeador

7

Đặt cược tốt nhất của bạn với một tập hợp lớn các mô hình là sử dụng các mô-đun django cho lợi thế của bạn và chỉ cần tạo một thư mục có tên là các mô hình. Di chuyển models.py cũ của bạn vào thư mục mô hình này và đổi tên nó thành __init__.py. Điều này sẽ cho phép bạn sau đó tách từng mô hình thành các tệp cụ thể hơn bên trong thư mục mô hình này.

Sau đó, bạn chỉ cần nhập từng mô hình vào không gian tên của __init__.py.

Vì vậy, ví dụ, bạn có thể muốn tách nó thành:

yourapp/ 
    models/ 
     __init__.py # This file should import anything from your other files in this directory 
     basic.py # Just an example name 
     morespecificmodels.py # Just an example name 
     managers.py # Might want to separate your manager into this 

Sau đó bạn __init__.py chỉ có thể là:

from basic import * # You should replace * with each models name, most likely. 
from managers import YourManager # Whatever your manager is called. 

Đây là cấu trúc mà tôi sử dụng khi file mô hình của tôi có được rất lớn, tuy nhiên tôi cố gắng phân chia mọi thứ thành nhiều ứng dụng có thể cắm càng nhiều càng tốt - vì vậy điều này hiếm khi được tôi sử dụng.

Hy vọng điều này sẽ hữu ích.

Các vấn đề liên quan