djangoモデルのクラス名を取得します


107

私はジャンゴモデルを持っています:

class Book(models.Model):
  [..]

モデル名を文字列「Book」にしたい。私がこの方法でそれを取得しようとすると:

Book.__class__.__name__

'ModelBase'を返します。

何か案が?

回答:


153

お試しくださいBook.__name__

DjangoモデルはModelBase、すべてのモデルのメタクラスであるから派生しています。


49

代わりに行うのでBook.__class__.__name__、あなたが本のオブジェクトの上にそれを行う場合は、クラス自体に、そしてbook_object.__class__.__name__あなたの「ブック」を与える(すなわちモデルの名前)


1
これは私の場合に役立ちました。異なるモデルの2つのクエリセットをマージしました。ループの中で、反復しているときにオブジェクトのクラス名を取得する必要がありました。
Peter

ピーター、2つのクエリセットをどのようにマージしましたか?または、マージされたセットはモデルインスタンスの単なるリストですか?ありがとう
little_birdie 2017年

38

上記答えで示唆されているように、あなたは使うことができますstr(Book._meta)

この質問はかなり古いですが、複数のアプリから同じモデル名を使用している可能性があるため、次の情報が役に立ちました(Django 1.11でテスト済みですが、古いバージョンでも機能する可能性があります...)。

本が次の場所にあると仮定しmy_appます。

print(Book._meta.object_name)
# Book

print(Book._meta.model_name)
# book

print(Book._meta.app_label)
# my_app

2
これは、Djangoの新しいバージョンでは受け入れられる答えになるはずです。
Bobort

あなたは正しい@Bobortです。Djangoバージョンで2.2.3も動作しています。
Kushan Gunasekera

8

クラス名を使って、

str(Book._meta)

Book.__class__.__name__  -> this will give you the ModelBase

ありがとう。str(self.model._meta)私が探していたものです。もう一方は親クラスをください。
ppython 2017年

あなたは、文字列への呼び出しよりも多くの暗黙的な何かをしたい場合は、と(ジャンゴ1.11で試してみました)同じことを得ることができますBook._meta.object_nameBook._meta.model_name。あなたにもアプリケーション名が必要な場合はその後、それが経由してアクセス可能ですBook._meta.app_label
Geekfish

4
class Book(models.Model):
  [..]   
  def class_name(self):
    return self.__class__.__name__

このようにして、book.class_name()Pythonコード(テンプレートでも{{book.class_name}})で呼び出すと、「Book」というクラス名が返されます。


3

モデルのMetaクラスからモデル名を取得することもできます。これは、モデルクラス自体とそのインスタンスで機能します。

# Model definition
class Book(models.Model):
    # fields...

    class Meta:
        verbose_name = 'book'
        verbose_name_plural = 'books'


# Get some model
book = Book.objects.first()

# Get the model name
book._meta.verbose_name

設定verbose_nameverbose_name_pluralオプションです。Djangoはモデルクラスの名前からこれらの値を推測します(管理サイトでこれらの値が使用されていることに気付いたかもしれません)。

https://docs.djangoproject.com/en/3.0/ref/models/options/#verbose-name

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.