[Django]-How can I obtain the model's name or the content type of a Django object?

111👍

You can get the model name from the object like this:

self.__class__.__name__

If you prefer the content type, you should be able to get that like this:

from django.contrib.contenttypes.models import ContentType
ContentType.objects.get_for_model(self)

11👍

The method get_for_model does some fancy stuff, but there are some cases when it’s better to not use that fancy stuff. In particular, say you wanted to filter a model that linked to ContentType, maybe via a generic foreign key?? The question here was what to use for model_name in:

content_type = ContentType.objects.get(model=model_name)

Use Foo._meta.model_name, or if you have a Foo object, then obj._meta.model_name is what you’re looking for. Then, you can do things like

Bar.objects.filter(content_type__model=Foo._meta.model_name)

This is an efficient way to filter the Bar table to return you objects which link to the Foo content type via a field named content_type.

👤AlanSE

4👍

Using gravelpot’s answer, to give a direct answer to the OP’s question:

We can get the object’s class through instance.__class__ and then pass it to the get_for_model function:

from django.contrib.contenttypes.models import ContentType
content_type = ContentType.objects.get_for_model(instance.__class__)

Leave a comment