Django – получить модель ContentType по имени модели (общие отношения)

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

Я создаю приложение чата, в 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, чтобы получить конкретную модель для конкретной строки. Есть ли способ найти модель только по ее имени?

Спасибо


person Uriel Bertoche    schedule 25.02.2011    source источник


Ответы (1)


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.

Очень похоже на 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)
person Yuji 'Tomita' Tomita    schedule 25.02.2011
comment
есть ли способ узнать, из какого приложения модель, если есть только одна модель с таким именем? - person Uriel Bertoche; 25.02.2011
comment
Конечно, contenttype.app_label - person Yuji 'Tomita' Tomita; 25.02.2011
comment
Я имею в виду, что не имея модели, просто строку имени, поищите в базе данных приложение, которое имеет эту модель. Я пробовал то, что ты грустишь, без особого успеха - person Uriel Bertoche; 25.02.2011
comment
app_string = ContentType.objects.get(model="model_string").app_label? Какова конечная цель здесь? Что Вы ищете? - person Yuji 'Tomita' Tomita; 25.02.2011
comment
Я понял, что делаю не так, всем спасибо. Я вводил строку модели, например «Комната», и не нашел никакой модели... Однако «комната» нашла то, что я искал. Спасибо! - person Uriel Bertoche; 25.02.2011
comment
примечание: строка должна быть ContentType.objects.get(app_label=auth, model=user) - person elad silver; 05.09.2017