Django запрос - аннотирование одним из двух полей (в зависимости от того, что существует) - PullRequest
0 голосов
/ 06 августа 2020

У меня есть следующие модели, которые описывают сотрудников на работе:

class Job(models.Model):
    name = models.CharField(max_length=255)
    address = models.CharField(max_length=255)
    # Several other Job related fields


class CrewAssignment(models.Model):
    job = models.ForeignKey(Job, on_delete=models.PROTECT, related_name='crew_assignments')
    user = models.ForeignKey(User, on_delete=models.PROTECT)
    date = models.DateField()
    # Several other crew related fields


class SubAssignment(models.Model):
    job = models.ForeignKey(Job, on_delete=models.PROTECT, related_name='crew_assignments')
    user = models.ForeignKey(User, on_delete=models.PROTECT)
    date = models.DateField()
    # Several other sub related fields

Учитывая пользователя u и дату d, я пытаюсь собрать запрос, который вернет все Job сущности, которые u были либо CrewAssignment, либо SubAssignment, с датой на d или после нее, аннотированной датой. Например, если d - это 2020-08-06, и у пользователя есть следующие назначения:

   CrewAssignment | Job id 1 | 2020-08-06
   SubAssignment  | Job id 2 | 2020-08-06
   CrewAssignment | Job id 1 | 2020-08-07
   CrewAssignment | Job id 3 | 2020-08-07
   SubAssignment  | Job id 3 | 2020-08-07

На заметку - пользователь выполнял задание 1 несколько дней (поэтому должен быть запись на каждый день), и пользователь был CrewAssignment и SubAssignment для Job 3 в один и тот же день, что должно создать только одну запись. Я хотел бы, чтобы мой результат выглядел примерно так:

[
   <Job: [pk:1], annotated with date='2020-08-06'>,
   <Job: [pk:2], annotated with date='2020-08-06'>,
   <Job: [pk:1], annotated with date='2020-08-07'>,
   <Job: [pk:3], annotated with date='2020-08-07'>
]

Другими словами - для данного пользователя, какие комбинации Job / Date были CrewAssignment и / или SubAssignment для всех дат больше или равно d

Примечание. Это должен быть один набор запросов, так как он будет передан сериализатору DRF.

Есть мысли о том, как лучше всего подойти к этому?

...