Django Queryset с множественными соединениями и фильтрацией
Мне нужен список рабочих мест, объединенных с домами, объединенными с владельцами
Строка результатов должна содержать: job_id, job_worker_role1, job_worker_role2, job_worker_role3, house_id, *owner_name, owner_status_name, owner_assigned_user
Учитывая, что между домами и владельцами существует связь "многие ко многим", допустимо иметь несколько строк результатов для каждой работы с каждым владельцем.
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)
Кроме того, мне нужно отфильтровать по:
- имя статуса владельца или id статуса владельца
- имя владельца как строка
- имя работника, назначенного владельцем, как строка
Я использую Django 4.0.1 с postgres
Вы можете фильтровать с помощью следующего:
Имя статуса владельца или идентификатор статуса владельца:
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'))
Имя владельца как строка
filterd_jobs = Job.objects.fitler(house__owners__name='owner_name')
владелец назначил имя работника как строку
filterd_jobs = Job.objects.fitler(house__owners__assigned_worker__name='assigned_worker_name')