web-dev-qa-db-ja.com

アプリを取得する方法Djangoモデルはからですか?

私は一般的な関係を持つモデルを持っています:

_TrackedItem --- genericrelation ---> any model
_

初期モデルから、追跡されたアイテムを一般的に取得できるようにしたいと思います。

私はそれを変更せずにどのモデルでもそれを行うことができるはずです。

そのためには、コンテンツタイプとオブジェクトIDを取得する必要があります。モデルインスタンスがあるのでオブジェクトIDを取得するのは簡単ですが、コンテンツタイプを取得するのは簡単ではありません。ContentType.object.filterにはモデル(_content_object.__class__.__name___)とapp_labelが必要です。

モデルが含まれているアプリを信頼できる方法で入手する方法がわかりません。

今のところ私はapp = content_object.__module__.split(".")[0]を実行しますが、Django contribアプリでは機能しません。

30
e-satis

Contenttypeを取得するためだけにアプリやモデルを取得する必要はありません。これを行うための便利な方法があります。

from Django.contrib.contenttypes.models import ContentType

ContentType.objects.get_for_model(myobject)

名前にもかかわらず、モデルクラスとインスタンスの両方で機能します。

31
Daniel Roseman

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
88
Wogan

組み込みのContentTypeクラスを使用して、オブジェクトからapp_labelmodelの両方を取得できます。

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プロパティを使用するという点でより良いアプローチです。

6
Dos