2010-04-30 34 views
22

Tôi có một mô hình với một mối quan hệ chung:Làm cách nào để tải ứng dụng mô hình Django?

TrackedItem --- genericrelation ---> any model 

Tôi muốn để có thể tổng quát được, từ mô hình ban đầu, mục theo dõi.

Tôi có thể làm điều đó trên bất kỳ mô hình nào mà không sửa đổi mô hình đó.

Để làm điều đó, tôi cần lấy loại nội dung và id đối tượng. Lấy id đối tượng dễ dàng vì tôi có thể hiện mẫu, nhưng việc lấy kiểu nội dung không phải là: ContentType.object.filter yêu cầu mô hình (chỉ là content_object.__class__.__name__) và app_label.

Tôi không biết làm thế nào để có được một cách đáng tin cậy ứng dụng trong đó có một mô hình.

Hiện tại tôi làm app = content_object.__module__.split(".")[0], nhưng nó không hoạt động với các ứng dụng contrib django.

Trả lời

28

Bạn không cần để có được những ứng dụng hoặc mô hình chỉ để có được contentType - có một phương pháp tiện dụng để làm việc đó:

ContentType.objects.get_for_model(myobject) 

Mặc dù cái tên, nó hoạt động cho cả lớp mô hình và các trường hợp.

+3

Đây là giải pháp tốt hơn so với sử dụng _meta. – Wogan

+8

Có phải không? Điều này có ảnh hưởng đến cơ sở dữ liệu không? – meshy

+1

@meshy yes nhưng django ContentType sử dụng bộ nhớ cache trên trình quản lý của nó để chỉ truy vấn một lần cho mỗi mô hình. – dalore

75

app_label có sẵn dưới dạng thuộc tính trên thuộc tính _meta của bất kỳ kiểu máy nào.

from django.contrib.auth.models import User 
print User._meta.app_label 
# The object name is also available 
print User._meta.object_name 
0

Bạn có thể có được cả hai app_labelmodel từ đối tượng của bạn bằng cách sử dụng built-in ContentType lớp

from django.contrib.contenttypes.models import ContentType 
from django.contrib.auth.models import User 

user_obj = User.objects.create() 
obj_content_type = ContentType.objects.get_for_model(user_obj) 

print(obj_content_type.app_label) 
# u'auth' 
print(obj_content_type.model) 
# u'user' 

Đây là một cách tiếp cận tốt hơn sự tôn trọng của việc sử dụng các _meta thuộc tính được định nghĩa là tư nhân.

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