web-dev-qa-db-ja.com

Djangoオブジェクトのモデル名またはコンテンツタイプを取得するにはどうすればよいですか?

保存コードにいるとしましょう。モデルの名前またはオブジェクトのコンテンツタイプを取得して使用するにはどうすればよいですか?

from Django.db import models

class Foo(models.Model):
    ...
    def save(self):
        I am here....I want to obtain the model_name or the content type of the object

このコードは機能しますが、model_nameを知っている必要があります。

import Django.db.models
from Django.contrib.contenttypes.models import ContentType

content_type = ContentType.objects.get(model=model_name)
model = content_type.model_class()
43
Seitaridis

次のようにして、オブジェクトからモデル名を取得できます。

self.__class__.__name__

コンテンツタイプを好む場合は、次のように取得できるはずです。

ContentType.objects.get_for_model(self)
69
gravelpot

メソッドget_for_modelはいくつかの手の込んだことを行いますが、その派手なものを使用しない方がよい場合もあります。特に、おそらく汎用の外部キーを介して、ContentTypeにリンクされているモデルをフィルタリングしたいとしますか?ここでの質問は、model_nameで何を使用するかでした。

content_type = ContentType.objects.get(model = model_name)

Foo._meta.model_nameを使用するか、Fooオブジェクトがある場合は、obj._meta.model_nameが目的のオブジェクトです。その後、次のようなことができます

Bar.objects.filter(content_type__model=Foo._meta.model_name)

これは、Barテーブルをフィルタリングして、content_typeというフィールドを介してFooコンテンツタイプにリンクするオブジェクトを返す効率的な方法です。

3
AlanSE