如何获取模型的名称或 Django 对象的内容类型?
Posted
技术标签:
【中文标题】如何获取模型的名称或 Django 对象的内容类型?【英文标题】:How can I obtain the model's name or the content type of a Django object? 【发布时间】:2011-06-19 07:10:01 【问题描述】:假设我在保存代码中。如何获取模型的名称或对象的内容类型,并使用它?
from django.db import models
class Foo(models.Model):
...
def save(self):
I am here....I want to obtain the model_name or the content type of the object
此代码有效,但我必须知道模型名称:
import django.db.models
from django.contrib.contenttypes.models import ContentType
content_type = ContentType.objects.get(model=model_name)
model = content_type.model_class()
【问题讨论】:
【参考方案1】:您可以像这样从对象中获取模型名称:
self.__class__.__name__
如果您更喜欢内容类型,您应该可以这样获得:
from django.contrib.contenttypes.models import ContentType
ContentType.objects.get_for_model(self)
【讨论】:
如果您有数据库浏览器工具,您可以看到创建了一个 django_content_type。它包含一些字段,如名称、app_label 和模型。我需要从我所在的班级获取该模型信息。 模型字段为小写字符串,派生自类名。 然后执行“ct = ContentType.objects.get_for_model(self)”之类的操作,然后执行“return ct.app_label”或您需要的任何 ContentType 属性。 或者只是小写类名来获取内容类型,随你喜欢...'print self.__class__.__name__.lower()' 通过ContentType
的解决方案需要额外的SQL请求。【参考方案2】:
get_for_model
方法做了一些花哨的东西,但在某些情况下最好不要使用那些花哨的东西。特别是,假设您想过滤链接到 ContentType 的模型,可能通过通用外键?这里的问题是model_name
使用什么:
content_type = ContentType.objects.get(model=model_name)
使用Foo._meta.model_name
,或者如果您有Foo
对象,那么obj._meta.model_name
就是您要查找的对象。然后,你可以做类似的事情
Bar.objects.filter(content_type__model=Foo._meta.model_name)
这是过滤Bar
表以返回通过名为content_type
的字段链接到Foo
内容类型的对象的有效方法。
【讨论】:
【参考方案3】:使用gravelpot的答案,直接回答OP的问题:
我们可以通过instance.__class__
获取对象的类,然后传递给get_for_model
函数:
from django.contrib.contenttypes.models import ContentType
content_type = ContentType.objects.get_for_model(instance.__class__)
【讨论】:
以上是关于如何获取模型的名称或 Django 对象的内容类型?的主要内容,如果未能解决你的问题,请参考以下文章
如何从中间件中的 Django 请求对象获取视图中使用的模型名称?
对于 django 模型,如何获取 django 管理 URL 以添加另一个或列出对象等?