如何获得Django模型的应用程序来自?

时间:2010-04-30 06:29:25

标签: django model

我有一个具有通用关系的模型:

TrackedItem --- genericrelation ---> any model

我希望能够从初始模型中获得跟踪项目。

我应该可以在任何模型上进行修改而无需修改它。

要做到这一点,我需要获取内容类型和对象ID。获取对象id很简单,因为我有模型实例,但获取内容类型不是:ContentType.object.filter需要模型(只是content_object.__class__.__name__)和app_label。

我不知道如何以可靠的方式获得模型所在的应用程序。

现在我做app = content_object.__module__.split(".")[0],但它不适用于django contrib应用。

3 个答案:

答案 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_labelmodel

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属性的更好方法。