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')
Вернуться на верх