在保存的 m2m 字段中获取产品的总价

get total price for the products in m2m field in save

Django 1.8 我正在尝试获取 m2m 字段中产品的总价。

from django.models.db import Sum

class Product(models.Model):
    ...
    price = models.DecimalField(default=0, max_digits=9, decimal_places=2)

class Order(models.Model):
    ...
    products = models.ManyToManyField(Product, related_name='orders')
    total = models.DecimalField()
    ...

    def save(self, *args, **kwargs):
        self.total = self.products.all().annotate(Sum('price'))

        super(Order, self).save(*args, **kwargs)

当我尝试保存 Order 对象时,上面的代码产生了 ValueError:

"<Order: None>" needs to have a value for field "order" before this
  many-to-many relationship can be used.

您是否有特定要求将此总数保存在您的数据库中?如果没有,

class Order(models.Model):
    ...
    products = models.ManyToManyField(Product, related_name='orders')
    ...

    @property
    def total(self):
        result = self.products.aggregate(Sum('price'))
        return result['price__sum']

最好的方法是通过信号:

https://docs.djangoproject.com/en/1.8/ref/signals/#m2m-changed

这是一个例子:

@receiver(m2m_changed, sender=BusquedaInmueble.zonas.through)
def post_save_busqueda_m2m (sender,  action, instance, *args, **kwargs):
  busqueda = instance
  if action == 'post_add':