DEV Community πŸ‘©β€πŸ’»πŸ‘¨β€πŸ’»

Cover image for ContentTypes
Abdelrahman hassaan hamdy
Abdelrahman hassaan hamdy

Posted on

ContentTypes

The main use of the contenttypes framework is to dynamically load models classes based on their name, and subsequently, query objects for that model.

The main model is ContentType, which is importable from django.contrib.contenttypes.model. This works like a normal model whose objects you can query.

If you know the model you want, you can query it using the app name and model name.

Entering Shell Commands:

from django.contrib.contenttypes.models import ContentType

query_post_type = ContentType.objects.get(app_label="bloge", model="post")

query_post_type

Enter fullscreen mode Exit fullscreen mode
The Output : <ContentType: bloge | post>
Enter fullscreen mode Exit fullscreen mode

We could also get a list of all the ContentTypes we have installed, by calling ContentType.objects.all():

ContentType.objects.all()
Enter fullscreen mode Exit fullscreen mode
The Output : 

<QuerySet [<ContentType: admin | log entry>, <ContentType: auth | permission>, <ContentType: auth | group>, <ContentType: auth | user>, <ContentType: contenttypes | content type>, <ContentType: sessions | session>, <ContentType: bloge | post>>
Enter fullscreen mode Exit fullscreen mode

Note that the ContentType object is not the Post model. But, we can retrieve the class with the model_class() method:

query_post_type.model_class()
Enter fullscreen mode Exit fullscreen mode
The Output : bloge.models.Post
Enter fullscreen mode Exit fullscreen mode

It’s also possible to go in reverse, and retrieve the ContentType object from the model. This is done with the ContentType.objects.get_for_model() method.

from blog.models import Post
ContentType.objects.get_for_model(Post)
Enter fullscreen mode Exit fullscreen mode
The OutPut
 <ContentType: bloge | post>
Enter fullscreen mode Exit fullscreen mode

This is useful if you want to know the app_label and model name for a model class.

Once a ContentType object is found, the shortcut method get_objects_for_this_type() will perform a get lookup and retrieve objects for that model class.

query_post_type.get_object_for_this_type(pk=1)
Enter fullscreen mode Exit fullscreen mode
The OutPut : <Post: An Example Post For this section >
Enter fullscreen mode Exit fullscreen mode

Note that this is a shortcut to get on the Post.objects manager instance:

query_post_type.model_class().objects.get(pk=1)
Enter fullscreen mode Exit fullscreen mode
The OutPut : <Post: An Example Post>
Enter fullscreen mode Exit fullscreen mode

query_post_type.get_object_for_this_type(pk=1) == query_post_type.model_class().objects.get(pk=1)

Enter fullscreen mode Exit fullscreen mode
The OutPut: True
Enter fullscreen mode Exit fullscreen mode

Other methods of loading objects (like filter() and all()) are similarly available – remember once you call model_class() it’s just like you’ve imported the model.

This is the extent of what is generally needed to be known to use contenttypes, but if you’re curious about the extra methods that are available, then you can read the contenttypes framework documentation.

Now that we’ve seen how the contenttypes framework can let us dynamically access models.

ending_artical

Top comments (0)

πŸ— We built a 100% open source community software called Forem.

Β 
You can contribute to the codebase or host your own.