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?

Jawaban:


153

Coba Book.__name__.

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


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)


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

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

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'.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.