Как я могу получить название модели или тип содержимого объекта Django? - PullRequest
37 голосов
/ 01 февраля 2011

Допустим, я в коде сохранения.Как я могу получить имя модели или тип содержимого объекта и использовать его?

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()

Ответы [ 2 ]

62 голосов
/ 01 февраля 2011

Вы можете получить название модели из объекта следующим образом:

self.__class__.__name__

Если вы предпочитаете тип контента, вы можете получить его следующим образом:

ContentType.objects.get_for_model(self)
2 голосов
/ 30 апреля 2019

Метод 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 для получения объектов, которые ссылаются на тип содержимого Foo через поле с именем content_type.

...