Get class name of django model

DjangoDjango Models

Django Problem Overview


I have a django model:

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

and I want to have the model name as string: 'Book'. When I try to get it this way:

Book.__class__.__name__

it returns 'ModelBase'.

Any idea?

Django Solutions


Solution 1 - Django

Try Book.__name__.

Django models are derived from the ModelBase, which is the Metaclass for all models.

Solution 2 - Django

Instead of doing Book.__class__.__name__ on class itself, if you do it over a book object, then book_object.__class__.__name__ will give you 'Book' (i.e the name of the model)

Solution 3 - Django

As suggested by the answer above, you can use str(Book._meta).

This question is quite old, but I found the following helpful (tested on Django 1.11, but might work on older...), as you may also have the same model name from multiple apps.

Assuming Book is in my_app:

print(Book._meta.object_name)
# Book

print(Book._meta.model_name)
# book

print(Book._meta.app_label)
# my_app


Solution 4 - Django

I got class name by using,

str(Book._meta)

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

Solution 5 - Django

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

With this way, whenever you called book.class_name() in python code (also in the template {{book.class_name}}) it will return class name which is 'Book'.

Solution 6 - Django

You could also retrieve the model name from the model's Meta class. This works on the model class itself as well as any instance of it:

# 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

Setting verbose_name and verbose_name_plural is optional. Django will infer these values from the name of the model class (you may have noticed the use of those values in the admin site).

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionschneckView Question on Stackoverflow
Solution 1 - DjangomikuView Answer on Stackoverflow
Solution 2 - Djangovijay shankerView Answer on Stackoverflow
Solution 3 - DjangoGeekfishView Answer on Stackoverflow
Solution 4 - DjangoMohideen bin MohammedView Answer on Stackoverflow
Solution 5 - DjangoBrkyrnView Answer on Stackoverflow
Solution 6 - DjangoLeoView Answer on Stackoverflow