2009-05-13 2 views
37

Tôi đã bắt đầu làm việc trên một ứng dụng cục bộ cho chính mình chạy qua trình duyệt. Có gần đây đã đi qua các hướng dẫn django tôi nghĩ rằng nó có thể là tốt hơn để sử dụng django chứ không chỉ là python đồng bằng.Khoảng 20 mẫu trong 1 ứng dụng django

Có một vấn đề: Tôi có ít nhất 20 mô hình và mỗi mô hình sẽ có nhiều chức năng. Rất đơn giản nó sẽ tạo ra một tập tin mô hình rất lớn và có lẽ là quan điểm quá lớn. Làm thế nào để chia chúng ra?

models are all related vì vậy tôi không thể đơn giản biến chúng thành các ứng dụng riêng biệt được không?

Trả lời

30

"Tôi có ít nhất 20 mô hình" - đây có lẽ là nhiều hơn một Django "ứng dụng" và là giống như một "dự án" Django với một số "ứng dụng" nhỏ

Tôi thích để phân vùng thứ xung quanh chủ đề hoặc các lĩnh vực chủ đề có một vài (1 đến 5) mô hình. Điều này trở thành một "ứng dụng" Django - và là đơn vị hữu ích của khả năng sử dụng lại.

"Dự án" tổng thể là tập hợp các ứng dụng trình bày thứ tích hợp được tạo thành từ các phần riêng biệt.

Điều này cũng giúp quản lý dự án vì mỗi "ứng dụng" có thể trở thành chạy nước rút với bản phát hành vào cuối.

+1

Nhưng nếu các mô hình có liên quan với nhau như thế nào tôi có thể đặt chúng trong các ứng dụng riêng biệt? – Teifion

+2

Một mô hình có thể dễ dàng tham khảo các mô hình trong gói khác. Bạn hầu như luôn có các mô hình "cấp cao hơn" và "cấp thấp hơn". Triển khai các mô hình cấp thấp hơn trong một ứng dụng. Các ứng dụng cấp cao hơn có thể phụ thuộc vào các mô hình của ứng dụng cấp thấp hơn. –

+13

Bất cứ khi nào bạn thiết lập khóa ngoài cho Mô hình người dùng trong django.contrib.auth, bạn liên quan đến các ứng dụng riêng biệt ... –

0

Bạn có thể chia nhỏ mô hình trên nhiều tệp. Điều này cũng cho lượt xem.

0

Bạn có thể chia chúng thành các tệp riêng biệt và chỉ cần nhập vào ở đầu trường models.py chính của bạn.

Cho dù bạn thực sự muốn muốn là một câu hỏi khác.

+0

Như Jarret Hardie đã nói, tạo một gói python (tức là một thư mục có tệp __init__.py trong đó) được gọi là các mô hình sẽ là cách tốt nhất để làm điều này. –

69

Đây là một nhu cầu khá phổ biến ... Tôi không thể tưởng tượng lội qua một tập tin models.py đó là 10.000 dòng dài :-)

Bạn có thể chia ra các tập tin models.py (và views.py quá) vào một pacakge. Trong trường hợp này, cây dự án của bạn sẽ trông giống như:

/my_proj 
    /myapp 
     /models 
      __init__.py 
      person.py 

Tệp __init__.py làm cho thư mục thành một gói. Gotcha duy nhất là phải chắc chắn để xác định một Meta lớp bên trong cho các mô hình của bạn mà chỉ ra app_label cho mô hình, nếu không Django sẽ gặp khó khăn khi xây dựng giản đồ của bạn:

class Person(models.Model): 
    name = models.CharField(max_length=128) 

    class Meta: 
     app_label = 'myapp' 

Khi đã xong, nhập khẩu các mô hình trong __init__.py của bạn nộp để Django và đồng bộ db sẽ tìm thấy nó:

from person import Person 

Bằng cách này bạn vẫn có thể làm from myapp.models import Person

+0

Đó là lý thuyết làm việc nhưng chạy dòng từ hướng dẫn "python manage.py sql gui" không làm bất cứ điều gì, bất kỳ ý tưởng gì? – Teifion

+1

Điều đó thường có nghĩa là django không thể tìm thấy các mô hình. Đảm bảo bạn đã nhập tệp trong tệp models.__init__.py của mình và bạn đã đặt app_label cho mỗi mô hình. Ngoài ra, hãy đảm bảo bạn đã xóa tệp models.py cũ. –

+11

Điều này là chính xác về mặt kỹ thuật, nhưng _almost_ downvote-xứng đáng vì đó là một ý tưởng tồi trong thực tế. Nếu bạn có đủ mô hình để suy nghĩ về việc tách mô hình của mình, bạn nên chia thành nhiều ứng dụng. –

16

Các mô hình này tất cả các liên quan vì vậy tôi không thể chỉ đơn giản là làm cho chúng vào các ứng dụng riêng biệt tôi có thể?

Bạn có thể tách chúng thành các ứng dụng riêng biệt. Để sử dụng một mô hình trong một ứng dụng từ một ứng dụng khác, bạn chỉ cần nhập nó theo cách tương tự như bạn sẽ nhập các ứng dụng django.contrib.

+14

+1. Không có luật chống lại các ứng dụng tùy thuộc vào nhau. – muhuk

5

Có 20 mô hình trong một ứng dụng có thể là dấu hiệu cho thấy bạn nên chia nhỏ các mô hình nhỏ hơn.

Mục đích của ứng dụng Django là có một đoạn mã nhỏ, phù hợp với nhau.

Vì vậy, nếu bạn có trang web thương mại điện tử, bạn có thể có ứng dụng shopping_cart, ứng dụng thanh toán, v.v.

Hãy nhớ rằng thực sự không có vấn đề gì trong các ứng dụng tùy thuộc vào nhau (mặc dù nó luôn tốt hơn nếu chúng có thể được tách riêng), nhưng bạn không nên có một ứng dụng thực hiện hai điều rất khác biệt.

Bài viết Django tips: laying out an application có thể giúp bạn. Như mọi khi, hãy lấy mọi thứ bạn đọc bằng một hạt muối (bao gồm cả câu trả lời này).