Django ManyToManyField with through -- как не потерять данные, не выбранные в QuerySet?
Новичок в Django. У меня есть некоторые проблемы с отношениями ManyToMany и сквозным полем.
Я пытаюсь создать инструмент, в котором сотрудники могут подавать заявки на смены на мероприятиях (бар, входной контроль и т.д.). Поэтому я создал объект Staff (это человек со всеми его ролями и т.д.) и связал его через ManyToManyField с объектом ScheduledShift (который содержит дату события, время и обязанности).
Я хочу иметь возможность представлять каждый день в виде представления для пользователя, где он/она может просто отметить смены, которые он/она доступны в этот день. Это работает, а также записывает правильные данные (т.е. идентификатор сотрудника и идентификатор смены для всех смен, которые он отметил) за этот день в "сквозную" таблицу (объект StaffShift)
Соответствующий код выглядит следующим образом:
models.py
class Staff(models.Model):
...
shifts = models.ManyToManyField(ScheduledEventShift, through='StaffShift')
class StaffShift(models.Model):
staff = models.ForeignKey(Staff, on_delete=models.CASCADE)
shift = models.ForeignKey(ScheduledEventShift, on_delete=models.CASCADE)
views.py
class StaffShiftUpdateView(ObjectUpdateView):
model = Staff
...
def get_form(self, form_class=None):
form = super().get_form(form_class=self.form_class)
day = datetime(self.kwargs.get('year'), self.kwargs.get('month'), self.kwargs.get('day'))
form.fields['shifts'].queryset = ScheduledEventShift.objects.filter(
event__event_date=day).order_by('event__event_date')
return form
('event' - свойство объекта ScheduledEventShift)
Моя проблема в том, что при записи этих идентификаторов в сквозную таблицу, все другие строки для этого пользователя, которые не были выбраны в QuerySet (т.е. все другие смены, которые он/она уже отметил для других дней), удаляются. Я уверен, что такое поведение задумано разработчиками Django, но для меня желательным было бы, чтобы они просто оставались неизменными в сквозной таблице.
Как я могу этого достичь? Спасибо