如何获取 Django 模型来自的应用程序?
Posted
技术标签:
【中文标题】如何获取 Django 模型来自的应用程序?【英文标题】:How to get the app a Django model is from? 【发布时间】:2011-02-14 02:55:22 【问题描述】:我有一个具有通用关系的模型:
TrackedItem --- genericrelation ---> any model
我希望能够从初始模型中通用地获取跟踪项目。
我应该能够在任何模型上做到这一点而无需修改它。
为此,我需要获取内容类型和对象 ID。获取对象 id 很容易,因为我有模型实例,但获取内容类型不是:ContentType.object.filter 需要模型(只是 content_object.__class__.__name__
)和 app_label。
我不知道如何以可靠的方式获得模型所在的应用程序。
目前我使用app = content_object.__module__.split(".")[0]
,但它不适用于 django contrib 应用程序。
【问题讨论】:
【参考方案1】:您不需要为了获取内容类型而获取应用程序或模型 - 有一个方便的方法可以做到这一点:
from django.contrib.contenttypes.models import ContentType
ContentType.objects.get_for_model(myobject)
尽管名称如此,但它适用于模型类和实例。
【讨论】:
是吗?这不会影响数据库吗? @meshy 是的,但 django ContentType 在其管理器上使用缓存,因此每个模型只查询一次。 导入为:from django.contrib.contenttypes.models import ContentType 使用.app_label
从get_for_model()
方法返回的ContentType对象中获取应用字符串。我在下面添加了一个示例。希望对您有所帮助。【参考方案2】:
您可以使用内置的 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
属性的更好方法。
【讨论】:
【参考方案3】: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
【讨论】:
我认为@DanielRoseman 的答案更好,因为它不需要访问私人成员_meta
@AddisonKlinke 也许是,但公平地说,他的回答需要导入和数据库命中
_meta
不是私有的,它的前缀是为了避免与用户创建的模型字段发生冲突。它记录在这里:docs.djangoproject.com/en/3.2/ref/models/meta
IIRC 而_meta
是公开的,app_label
不是(根据 Django 文档)。也就是说,我不记得它多年来一直在变化,所以我很乐意使用它。以上是关于如何获取 Django 模型来自的应用程序?的主要内容,如果未能解决你的问题,请参考以下文章
Django:如何根据来自行的数据和来自另一个模型的数据将聚合字段添加到查询集中?
如何在 Django 中从用户模型的字段自动填充和显示数据到来自不同应用程序的另一个模型?