Dapatkan nama kelas model django

107

Saya memiliki model django:

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

dan saya ingin memiliki nama model sebagai string: 'Book'. Ketika saya mencoba mendapatkannya dengan cara ini:

Book.__class__.__name__

itu mengembalikan 'ModelBase'.

Ada ide?

Schneck
sumber

Jawaban:

153

Coba Book.__name__.

Model Django diturunkan dari ModelBase, yang merupakan Metaclass untuk semua model.

miku
sumber
49

Alih-alih melakukannya Book.__class__.__name__di kelas itu sendiri, jika Anda melakukannya di atas objek buku, maka Anda book_object.__class__.__name__akan memberi Anda 'Buku' (yaitu nama model)

vijay shanker
sumber
1
Yang ini membantu saya dalam kasus saya. Saya menggabungkan 2 queryset yang memiliki model berbeda. Dalam satu lingkaran saya perlu mendapatkan nama kelas dari objek saat saya melakukan iterasi.
Peter
Peter, bagaimana Anda menggabungkan dua queryset ?? Atau apakah kumpulan yang digabungkan hanyalah daftar contoh model ?? Terima kasih
little_birdie
38

Seperti yang disarankan oleh jawaban di atas , Anda dapat menggunakan str(Book._meta).

Pertanyaan ini cukup lama, tetapi saya menemukan yang berikut berguna (diuji pada Django 1.11, tetapi mungkin bekerja pada yang lebih lama ...), karena Anda mungkin juga memiliki nama model yang sama dari banyak aplikasi.

Dengan asumsi Buku ada di my_app:

print(Book._meta.object_name)
# Book

print(Book._meta.model_name)
# book

print(Book._meta.app_label)
# my_app
Geekfish
sumber
2
Ini harus menjadi jawaban yang diterima untuk versi terbaru dari Django.
Bobort
Anda benar @Bobort, ini bekerja pada versi Django 2.2.3juga.
Kushan Gunasekera
8

Saya mendapatkan nama kelas dengan menggunakan,

str(Book._meta)

Book.__class__.__name__  -> this will give you the ModelBase
Mohideen bin Mohammed
sumber
Terima kasih; str(self.model._meta)adalah apa yang saya cari; Adapun yang lain beri aku kelas orang tua.
ppython
Jika anda menginginkan sesuatu yang lebih implisit daripada panggilan ke string, maka anda bisa mendapatkan yang sama (dicoba pada Django 1.11) dengan: Book._meta.object_nameatau Book._meta.model_name. Kemudian jika Anda menginginkan nama aplikasinya juga, itu dapat diakses melaluiBook._meta.app_label
Geekfish
4
class Book(models.Model):
  [..]   
  def class_name(self):
    return self.__class__.__name__

Dengan cara ini, setiap kali Anda memanggil book.class_name()kode python (juga di template {{book.class_name}}) itu akan mengembalikan nama kelas yaitu 'Buku'.

Brkyrn
sumber
3

Anda juga dapat mengambil nama model dari kelas Meta model. Ini berfungsi pada kelas model itu sendiri serta setiap instance-nya:

# 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

Pengaturan verbose_namedan verbose_name_pluralbersifat opsional. Django akan menyimpulkan nilai-nilai ini dari nama kelas model (Anda mungkin telah memperhatikan penggunaan nilai-nilai itu di situs admin).

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

Leo
sumber