Holen Sie sich den Klassennamen des Django-Modells

107

Ich habe ein Django-Modell:

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

und ich möchte den Modellnamen als Zeichenfolge haben: 'Buch'. Wenn ich versuche, es so zu machen:

Book.__class__.__name__

es gibt 'ModelBase' zurück.

Irgendeine Idee?

schneck
quelle

Antworten:

153

Versuchen Sie es Book.__name__.

Django-Modelle werden von ModelBaseder Metaklasse für alle Modelle abgeleitet.

miku
quelle
48

Statt tun Book.__class__.__name__sich auf Klasse, wenn Sie es über ein Buch Objekt tun, dann book_object.__class__.__name__geben Sie ‚Buch‘ (dh der Name des Modells)

Vijay Shanker
quelle
1
Dieser hat mir in meinem Fall geholfen. Ich habe 2 Abfragesätze verschiedener Modelle zusammengeführt. In einer Schleife musste ich den Klassennamen des Objekts abrufen, wenn ich iteriere.
Peter
Peter, wie hast du zwei Querysets zusammengeführt? Oder ist die zusammengeführte Menge nur eine Liste von Modellinstanzen? Danke
little_birdie
37

Wie in der obigen Antwort vorgeschlagen , können Sie verwenden str(Book._meta).

Diese Frage ist ziemlich alt, aber ich fand Folgendes hilfreich (getestet auf Django 1.11, funktioniert aber möglicherweise auf älteren ...), da Sie möglicherweise auch denselben Modellnamen aus mehreren Apps haben.

Vorausgesetzt, das Buch ist in my_app:

print(Book._meta.object_name)
# Book

print(Book._meta.model_name)
# book

print(Book._meta.app_label)
# my_app
Geekfish
quelle
2
Dies sollte die akzeptierte Antwort für neuere Versionen von Django sein.
Bobort
Du hast Recht @Bobort, es funktioniert auch mit der Django-Version 2.2.3.
Kushan Gunasekera
8

Ich habe den Klassennamen mit,

str(Book._meta)

Book.__class__.__name__  -> this will give you the ModelBase
Mohideen bin Mohammed
quelle
Vielen Dank; str(self.model._meta)ist das, wonach ich gesucht habe; Was den anderen betrifft, gib mir die Elternklasse.
Python
Wenn Sie etwas impliziteres als einen Aufruf von string möchten, können Sie dasselbe (versucht in Django 1.11) mit: Book._meta.object_nameoder erhalten Book._meta.model_name. Wenn Sie dann auch den Namen der App möchten, können Sie überBook._meta.app_label
Geekfish
4
class Book(models.Model):
  [..]   
  def class_name(self):
    return self.__class__.__name__

Auf diese Weise wird bei jedem Aufruf book.class_name()von Python-Code (auch in der Vorlage {{book.class_name}}) der Klassenname "Book" zurückgegeben.

Brkyrn
quelle
3

Sie können den Modellnamen auch aus der Meta-Klasse des Modells abrufen. Dies funktioniert sowohl für die Modellklasse selbst als auch für jede Instanz davon:

# 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

Einstellung verbose_nameund verbose_name_pluralist optional. Django leitet diese Werte aus dem Namen der Modellklasse ab (möglicherweise haben Sie die Verwendung dieser Werte auf der Admin-Site bemerkt).

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

Löwe
quelle