我有一个具有通用关系的模型:
TrackedItem --- genericrelation ---> any model
我希望能够从初始模型中获得跟踪项目。
我应该可以在任何模型上进行修改而无需修改它。
要做到这一点,我需要获取内容类型和对象ID。获取对象id很简单,因为我有模型实例,但获取内容类型不是:ContentType.object.filter需要模型(只是content_object.__class__.__name__
)和app_label。
我不知道如何以可靠的方式获得模型所在的应用程序。
现在我做app = content_object.__module__.split(".")[0]
,但它不适用于django contrib应用。
答案 0 :(得分:86)
app_label
可用作任何模型的_meta
属性的属性。
from django.contrib.auth.models import User
print User._meta.app_label
# The object name is also available
print User._meta.object_name
答案 1 :(得分:30)
您不需要获取应用程序或模型来获取内容类型 - 有一个方便的方法可以做到这一点:
from django.contrib.contenttypes.models import ContentType
ContentType.objects.get_for_model(myobject)
尽管有名称,但它适用于模型类和实例。
答案 2 :(得分:6)
您可以使用内置的 ContentType 类从对象获取app_label
和model
:
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'
这是使用为私人目的定义的_meta
属性的更好方法。