This post cross-published with OnePublish
I will show you how to use @property
decorator in Django models to make code clean and optimized. Instead of adding extra fields to our model, we can define a custom property that will use already existing fields to return the required data.
Example Scenario
We have a model named Post
with the following fields:
class Post(models.Model):
name = models.CharField(max_length=255)
description = models.TextField()
Assume that we also need a field to let us know which post names include specific prefixes such as example_
and another one for getting comments
of a particular post.
It will be a bad approach if we continuously use if statements
and call Comment.objects.filter(post_id=post.id)
queryset multiple times in different parts of the codebase.
Creating property for Django model
Instead, we can create a property that will behave like a field of our Django model but in a more flexible way.
class Post(models.Model):
name = models.CharField(max_length=255)
description = models.TextField()
@property
def has_prefix(self):
return "_example" in self.name
@property
def comments(self):
if self.id:
return Comment.objects.filter(post_id=self.id)
return Comment.objects.none()
Consider the naming of properties, it should be meaningful and straightforward without using prefixes like get_comments or similar.
So you can call these properties like below:
post = Post.objects.first()
if post.has_prefix:
# do something
return post.comments
Support π
If you feel like you unlocked new skills, please share them with your friends and subscribe to the youtube channel to not miss any valuable information.
Top comments (0)