web-dev-qa-db-ja.com

Django-モデル名でContentTypeモデルを取得する(Generic Relations)

私はこれについてしばらく考えています、

チャットアプリケーションを作成しています。chat.modelsでクラスRoomが指定されていますが、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を記述しなくても、何でもかまいません。 「名前」だけでモデルを見つける方法はありますか?

ありがとう

19
Uriel Bertoche

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

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の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)
41