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)