schneck
schneck

Reputation: 10827

Get class name of django model

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?

Upvotes: 149

Views: 119690

Answers (6)

Leo
Leo

Reputation: 469

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

Upvotes: 6

Brkyrn
Brkyrn

Reputation: 460

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

Upvotes: 7

Geekfish
Geekfish

Reputation: 2314

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

Upvotes: 90

Mohideen bin Mohammed
Mohideen bin Mohammed

Reputation: 20137

I got class name by using,

str(Book._meta)

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

Upvotes: 8

vijay shanker
vijay shanker

Reputation: 2663

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)

Upvotes: 75

miku
miku

Reputation: 188014

Try Book.__name__.

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

Upvotes: 205

Related Questions