manytomany 的 Django 聚合总和正在将其字段中的所有内容相加,而不是选择的内容
Django aggregate sum of manytomany is adding up everything in its field instead of the ones selected
2 类 涉及问题 class 约会和 class 服务
appointmentApp.models class 服务
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 约会
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_chosen 的 service_time
但是我的保存功能所做的是将所有现有的 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)
2 类 涉及问题 class 约会和 class 服务
appointmentApp.models class 服务
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 约会
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_chosen 的 service_time
但是我的保存功能所做的是将所有现有的 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)