Django aggregate sum of manytomany складывает все в своем поле вместо выбранных

2 Классы, участвующие в вопросе класс Назначение и класс Обслуживание

appointmentApp.models class Service

class Service(models.Model):
    service_name = models.CharField(max_length=15, blank=False)
    service_time = models.IntegerField(blank=False)
    
    def __str__(self):
        return self.service_name

    class Meta:
        verbose_name_plural = "Services"

appointmentApp/models.py class Appointment

class Appointment(models.Model):
    service_chosen = models.ManyToManyField(Service, blank=False)
    total_time = models.IntegerField(blank=False, null=False, default=0)

    #will add up the amount of time needed for each service
    def save(self, *args, **kwargs):
        self.total_time += Service.objects.all().aggregate(total_time=Sum('service_time'))['total_time']
        super(Appointment, self).save(*args, **kwargs)

    def __str__(self):
        return self.client_dog_name

Услуги выбираются с помощью поля множественного выбора, и при сохранении время обслуживания выбранной услуги суммируется

но вместо этого моя функция сохранения складывает все существующие service.service_time вместо выбранных, почему это происходит?

ManyToManyFields сохраняются послесодержащего экземпляра, необходимо создать обработчик сигнала для выполнения этого обновления на m2m_changed

from django.db.models.signals import m2m_changed


class Appointment(models.Model):
    ...


def service_chosen_changed(sender, instance=None, action=None, **kwargs):
    if action == 'post_add':
        instance.total_time = instance.service_chosen.aggregate(total_time=Sum('service_time'))['total_time']
        instance.save()

m2m_changed.connect(service_chosen_changed, sender=Appointment.service_chosen.through)
Вернуться на верх