There are theses models and relations :
Hours --FK--> Task --FK--> Project <--FK-- Period
class Hour(models.Model):
date = models.DateField(...)
task = models.ForeignKey(Task, ...)
class Task(models.Model):
project = models.ForeignKey(Project, ...)
class Project(models.Model):
pass
class Period(models.Model):
project = models.ForeignKey(Project,...)
start = models.DateField(...)
end = models.DateField(...)
Summary :
Hour has one task
Task has one project
Period has one project
Hour has a date
Period has a start date and a end date
For a given date and a given project there is one or none period possible
I want to populate a period field in Hour objects the same way it would be done with prefetch_related (using queryset)
I want to have something like this :
hours = Hour.objects.prefetch_period().all()
hours.first().period # Period(...)
Using a custom queryset method like this :
class HourQuerySet(models.query.QuerySet):
def prefetch_related(self):
return ???
For the moment I've only succeed doing this using annotate and Subquery, but I only manage to retrieve the period_id and not the prefetched period :
def inject_period(self):
period_qs = (
Period.objects.filter(
project__tasks=OuterRef("task"), start__lte=OuterRef("date"), end__gte=OuterRef("date")
)
.values("id")[:1]
)
return self.annotate(period_id=Subquery(period_qs))