To get the class name of an instance in Python: Use the type() function and __name__ to get the type or class of the Object/Instance. Using the combination of the __class__ and __name__ to get the type or class of the Object/Instance.
In Django 1.7+ it is better to use get_model() on the Django app registry, which is available via django. apps. apps. get_model(model_name) .
Using settings. AUTH_USER_MODEL will delay the retrieval of the actual model class until all apps are loaded. get_user_model will attempt to retrieve the model class at the moment your app is imported the first time. get_user_model cannot guarantee that the User model is already loaded into the app cache.
Try Book.__name__
.
Django models are derived from the ModelBase
, which is the Metaclass for all models.
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)
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
I got class name by using,
str(Book._meta)
Book.__class__.__name__ -> this will give you the ModelBase
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'.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With