When you use the dot notation in @hook decorator for the related fields (ForeignKey or OneToOneField) it hits the database for every object separately. It doesn't matter if you use select_related or not.
Here are the models to test:
from django.contrib.auth.models import User
from django.db import models
from django_lifecycle import LifecycleModel, hook, AFTER_SAVE
class Organization(models.Model):
name = models.CharField(max_length=250)
class Profile(LifecycleModel):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
employer = models.ForeignKey(Organization, on_delete=models.SET_NULL, null=True)
bio = models.TextField(null=True, blank=True)
age = models.PositiveIntegerField(null=True, blank=True)
@hook(AFTER_SAVE, when='user.first_name', has_changed=True)
@hook(AFTER_SAVE, when='user.last_name', has_changed=True)
def user_changed(self):
print('User was changed')
@hook(AFTER_SAVE, when='employer.name', has_changed=True)
def employer_changed(self):
print('Employer was changed')
What I got when tried to fetch profiles (with db queries logging):
When you use the dot notation in
@hook
decorator for the related fields (ForeignKey or OneToOneField) it hits the database for every object separately. It doesn't matter if you useselect_related
or not. Here are the models to test:What I got when tried to fetch profiles (with db queries logging):