Подтвердить что ты не робот

Как получить приложение от модели Django?

У меня есть модель с общим отношением:

TrackedItem --- genericrelation ---> any model

Я хотел бы иметь возможность получить из исходной модели отслеженный элемент.

Я мог бы сделать это на любой модели, не изменяя ее.

Для этого мне нужно получить тип контента и идентификатор объекта. Получение идентификатора объекта легко, так как у меня есть экземпляр модели, но для получения типа содержимого нет: ContentType.object.filter требует, чтобы модель (которая была просто content_object.__class__.__name__) и app_label.

Я понятия не имею, как надежно найти приложение, в котором находится модель.

Пока что я делаю app = content_object.__module__.split(".")[0], но он не работает с приложениями django contrib.

4b9b3361

Ответ 1

Вам не нужно получать приложение или модель только для того, чтобы получить contenttype - есть удобный способ сделать именно это:

ContentType.objects.get_for_model(myobject)

Несмотря на имя, оно работает как для классов моделей, так и для экземпляров.

Ответ 2

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

Ответ 3

Вы можете получить как app_label, так и model из своего объекта, используя встроенный 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, которые определены как частные.