私は一般的な関係を持つモデルを持っています:
_TrackedItem --- genericrelation ---> any model
_
初期モデルから、追跡されたアイテムを一般的に取得できるようにしたいと思います。
私はそれを変更せずにどのモデルでもそれを行うことができるはずです。
そのためには、コンテンツタイプとオブジェクトIDを取得する必要があります。モデルインスタンスがあるのでオブジェクトIDを取得するのは簡単ですが、コンテンツタイプを取得するのは簡単ではありません。ContentType.object.filterにはモデル(_content_object.__class__.__name__
_)とapp_labelが必要です。
モデルが含まれているアプリを信頼できる方法で入手する方法がわかりません。
今のところ私はapp = content_object.__module__.split(".")[0]
を実行しますが、Django contribアプリでは機能しません。
Contenttypeを取得するためだけにアプリやモデルを取得する必要はありません。これを行うための便利な方法があります。
from Django.contrib.contenttypes.models import ContentType
ContentType.objects.get_for_model(myobject)
名前にもかかわらず、モデルクラスとインスタンスの両方で機能します。
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
組み込みのContentTypeクラスを使用して、オブジェクトからapp_label
とmodel
の両方を取得できます。
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
プロパティを使用するという点でより良いアプローチです。