Django - Получить модель ContentType по названию модели (Generic Relations) - PullRequest
18 голосов
/ 25 февраля 2011

Я думаю об этом какое-то время,

Я создаю приложение чата, в chat.models указан класс Room, однако Room может быть связан с чем угодно в моем проекте, так как он использует общее отношение в своем внешнем ключе.

Есть ли способ узнать, к какой модели относится эта Комната, зная только название модели?

Как:

ctype = 'user'

related_to_user = Room.objects.filter(content_type=ctype)

Проблема, с которой я столкнулся, в приведенном ниже коде:

doc = get_object_or_404(Document, id=id)
# get *or create* a chat room attached to this document
room = Room.objects.get_or_create(doc)

Если я не хочу использовать модель документа, если мне нужна модель, связанная со строкой, строкой, которая может быть чем угодно, без необходимости записывать тонны if для получения конкретной Модели для конкретной строки. Есть ли способ найти модель просто по ее имени?

Спасибо

1 Ответ

40 голосов
/ 25 февраля 2011

http://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#methods-on-contenttype-instances

user_type = ContentType.objects.get(app_label="auth", model="user")
user_type = ContentType.objects.get(model="user")
# but this can throw an error if you have 2 models with the same name.

Очень похоже на django's get_model

from django.db.models import get_model
user_model = get_model('auth', 'user')

Чтобы использовать ваш пример точно:

ctype = ContentType.objects.get(model='user')
related_to_user = Room.objects.filter(content_type=ctype)
...