如何获取模型的名称或 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 以添加另一个或列出对象等?

如何在不定义内容类型或模型的情况下使用 Django 权限?

django - 从不同的模型字段名称中获取一组对象

django模型,如何动态设置查询的字段?

从 Django 获取多个随机对象时,查询集如何工作?