Python classes can treat a function as an attribute using the property decorator. Django models can use it as well. In the previous example, replace the function definition line with the following:
@property def age(self):
Now, we can access the user's age with profile.age. Notice that the function's name is shortened as well.
An important shortcoming of a property is that it is invisible to the ORM, just like model methods are. You cannot use it in a QuerySet object. For example, this will not work, Profile.objects.exclude(age__lt=18). However, it is visible to views or templates.
In case you need to use it in a QuerySet object, you might want to use a Query expression. Use the annotate function to add a query expression ...