2010-04-30 38 views
22

我有一个通用的关系的模型:如何从Django模型获取应用程序?

TrackedItem --- genericrelation ---> any model 

我希望能够得到一般,从最初的模型,跟踪项目。

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

为此,我需要获取内容类型和对象ID。获取对象ID很容易,因为我有模型实例,但获取内容类型不是:ContentType.object.filter需要模型(仅为content_object.__class__.__name__)和app_label。

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

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

回答

28

您不需要获取应用程序或模型刚拿到的contentType - 有做到这一点方便的方法:

ContentType.objects.get_for_model(myobject) 

尽管名称,它适用于这两种模型类和实例。

+3

这是比使用_meta更好的解决方案。 – Wogan 2010-04-30 06:47:48

+8

是吗?这不是命中数据库吗? – meshy 2014-11-03 16:44:01

+1

@meshy yes但django ContentType在其管理器上使用缓存,因此它只在每个模型中查询一次。 – dalore 2016-03-06 11:05:18

75

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 
0

您可以使用内置的ContentType的

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性能得到你的对象既app_labelmodel

相关问题