'Django Queryset with multiple joins and filtering
I need a list of jobs joined with houses joined with owners
Results row should contain: job_id, job_worker_role1, job_worker_role2, job_worker_role3, house_id, *owner_name, owner_status_name, owner_assigned_user
Given that there is a many to many relationship between houses and owners it is acceptable to have multiple result rows for each job, with each owner.
class Worker:
name = models.CharField()
class OwnerStatus:
name = models.CharField()
class Owner:
name = models.CharField()
status = models.ForeignKey(OwnerStatus, related_name='owners')
assigned_worker = models.ForeignKey(Worker, related_name='assigned_user_owner')
class House:
owners = models.ManyToManyField(Owner, related_name='assets')
class Job:
house = models.ForeignKey(House, related_name='jobs')
worker_role1 = models.ForeignKey(Worker)
worker_role2 = models.ForeignKey(Worker)
worker_role3 = models.ForeignKey(Worker)
updated_at = models.DateTimeField(auto_now=True)
Also, I need to filter by:
- owner status name or owner status id
- owner name as string
- owner assigned worker name as string
I am using Django 4.0.1 with postgres
Solution 1:[1]
You can filter with the following:
Owner status name or owner status id:
from django.db.models import Q
filterd_jobs = Job.objects.filter(Q(house__owners__status__name='status_name') | Q(house__owners__status_id='status_id'))
Owner name as string
filterd_jobs = Job.objects.fitler(house__owners__name='owner_name')
owner assigned worker name as string
filterd_jobs = Job.objects.fitler(house__owners__assigned_worker__name='assigned_worker_name')
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Ashrof |