Как получить приложение от модели Django?
У меня есть модель с общим отношением:
TrackedItem --- genericrelation ---> any model
Я хотел бы иметь возможность получить из исходной модели отслеженный элемент.
Я мог бы сделать это на любой модели, не изменяя ее.
Для этого мне нужно получить тип контента и идентификатор объекта. Получение идентификатора объекта легко, так как у меня есть экземпляр модели, но для получения типа содержимого нет: ContentType.object.filter требует, чтобы модель (которая была просто content_object.__class__.__name__
) и app_label.
Я понятия не имею, как надежно найти приложение, в котором находится модель.
Пока что я делаю app = content_object.__module__.split(".")[0]
, но он не работает с приложениями django contrib.
Ответы
Ответ 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
, которые определены как частные.