Django modelinin sınıf adını alın


107

Bir django modelim var:

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

ve model adını string olarak almak istiyorum: 'Kitap'. Bu şekilde almaya çalıştığımda:

Book.__class__.__name__

'ModelBase' döndürür.

Herhangi bir fikir?

Yanıtlar:


153

Deneyin Book.__name__.

Django modelleri, ModelBasetüm modellerin Metasınıfından türetilir.


49

Book.__class__.__name__Sınıfın kendisi üzerinde yapmak yerine, bunu bir kitap nesnesi üzerinde yaparsanız, book_object.__class__.__name__size 'Kitap' (yani modelin adı) verir.


1
Bu benim durumumda bana yardımcı oldu. Farklı modellerde olan 2 sorgu kümesini birleştirdim. Bir döngüde, yinelediğimde nesnenin sınıf adını almam gerekiyordu.
Peter

Peter, iki sorgu kümesini nasıl birleştirdin ?? Veya birleştirilmiş küme yalnızca model örneklerinin bir listesi mi? Teşekkürler
little_birdie

38

Yukarıdaki cevabın önerdiği gibi kullanabilirsiniz str(Book._meta).

Bu soru oldukça eski, ancak aşağıdakileri yararlı buldum (Django 1.11'de test edildi, ancak daha eski sürümlerde çalışabilir ...), çünkü birden fazla uygulamada aynı model adına sahip olabilirsiniz.

Kitabın içinde olduğunu varsayarsak my_app:

print(Book._meta.object_name)
# Book

print(Book._meta.model_name)
# book

print(Book._meta.app_label)
# my_app

2
Bu, Django'nun daha yeni sürümleri için kabul edilen cevap olmalıdır.
Bobort

Haklısın @ Bobort, Django versiyonu üzerinde 2.2.3de çalışıyor .
Kushan Gunasekera

8

Kullanarak sınıf ismini aldım,

str(Book._meta)

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

Teşekkürler; str(self.model._meta)aradığım şeydi; diğerine gelince bana ebeveyn sınıfını verin.
ppython

Bir dizge çağrısından daha örtük bir şey istiyorsanız, aynı şeyi (Django 1.11'de denendi): Book._meta.object_nameveya ile alabilirsiniz Book._meta.model_name. O zaman uygulama adını da istiyorsanız, buna şu Book._meta.app_label
adresten

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

Bu şekilde, book.class_name()python kodunu her çağırdığınızda (şablonda da {{book.class_name}}), 'Kitap' olan sınıf adını döndürecektir.


3

Model adını modelin Meta sınıfından da alabilirsiniz. Bu, model sınıfının kendisi ve bunun herhangi bir örneği üzerinde çalışır:

# 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

Ayar verbose_nameve verbose_name_pluralisteğe bağlıdır. Django bu değerleri model sınıfının adından çıkaracaktır (bu değerlerin yönetici sitesinde kullanıldığını fark etmiş olabilirsiniz).

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.