2010-03-19 5 views
14

Để đặt các mô hình của tôi vào các thư mục con, tôi đã cố gắng sử dụng trường Meta app_label như được mô tả here.Mô hình trong thư mục con thông qua app_label?

cấu trúc thư mục của tôi trông như thế này:

  • dự án
    • ứng dụng
      • foo
        • mô hình
          • __init_ _.py
          • bar_model.py

Trong bar_model.py tôi xác định mô hình của tôi như thế này:

from django.db import models 

class SomeModel(models.Model): 

    field = models.TextField() 

    class Meta: 
     app_label = "foo" 

tôi thành công có thể nhập kiểu như sau:

from apps.foo.models.bar_model import SomeModel 

Tuy nhiên, chạy:

./manage.py syncdb 

không tạo ra các bảng cho mô hình. Tuy nhiên, trong chế độ tiết, tôi thấy rằng ứng dụng "foo" được nhận dạng đúng (trong INSTALLED_APPS trong settings.py). Di chuyển mô hình đến models.py dưới foo không hoạt động.

Có một số quy ước cụ thể không được ghi lại bằng app_label hoặc với toàn bộ cơ chế ngăn cấu trúc mô hình này không được syncdb nhận dạng không?

Trả lời

18

Xem Django vé #10985: Explain how models can be organised in a directory

Có thể là bạn không nhập khẩu mô hình của bạn vào __init__.py?

+0

Chính xác! Bây giờ nó hoạt động. – nikola

+2

Cảm ơn! Vâng, bạn sẽ cần phải nhập chúng vào '__init __. Py' và cung cấp cho chúng một' app_label' thông qua lớp 'Meta' của mô hình. –

+0

Quan trọng bổ sung từ @ mustafa.0x bạn * phải * cung cấp cùng một app_label hơn tên nhãn bạn cung cấp làm tên mô-đun hoặc tên bạn cung cấp trong đăng ký AppConfig nếu không nó sẽ trả về một OrderedDict trống() nếu bạn nhận apps.get_app_config (mô hình 'app_label') sau khi nhập django.apps.apps – danigosa

3

syncdb sẽ không tạo bảng cho các mô hình không nằm trong <appname>.models, vì vậy hãy nhập bảng vào đó, ví dụ: from apps.foo.models import SomeModel.

+0

Không, điều đó cũng không hoạt động, tức là syncdb không nhận SomeModel. – nikola

+0

EDIT: Bây giờ tôi nhận ra bạn đã chỉ trong cùng một hướng như Van Gale. Tôi đã đánh dấu câu trả lời đúng của anh ta vì nó cũng chứa một liên kết đến cuộc thảo luận về tài liệu thích hợp của app_label. – nikola