Как получить приложение от модели Django? - PullRequest
27 голосов
/ 30 апреля 2010

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

TrackedItem --- genericrelation ---> any model

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

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

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

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

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

Ответы [ 3 ]

88 голосов
/ 30 апреля 2010

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
30 голосов
/ 30 апреля 2010

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

from django.contrib.contenttypes.models import ContentType

ContentType.objects.get_for_model(myobject)

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

6 голосов
/ 22 ноября 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...