Reputation: 10827
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
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
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
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
Reputation: 20137
I got class name by using,
str(Book._meta)
Book.__class__.__name__ -> this will give you the ModelBase
Upvotes: 8
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
Reputation: 188014
Try Book.__name__
.
Django models are derived from the ModelBase
, which is the Metaclass for all models.
Upvotes: 205