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?

Antworten:


153

Versuchen Sie es Book.__name__.

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


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)


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

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

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.


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.