Python Django:多对多关系的自定义保存方法

Python Django:多对多关系的自定义保存方法,python,django,django-models,django-orm,Python,Django,Django Models,Django Orm,我需要在多对多关系上设置自定义保存和删除方法 我试图用through属性指定一个模型,但这使我的代码过于复杂,并引入了一些问题。我不需要多对多模型上的任何额外字段,只需要自定义保存和删除方法 是否可以在不指定through属性的情况下完成此操作 以下是代码: class Order(BaseDate): #lots of fields relateds = models.ManyToManyField('RelatedProduct', verbose_name=_('relat

我需要在多对多关系上设置自定义保存和删除方法

我试图用through属性指定一个模型,但这使我的代码过于复杂,并引入了一些问题。我不需要多对多模型上的任何额外字段,只需要自定义保存和删除方法

是否可以在不指定through属性的情况下完成此操作

以下是代码:

class Order(BaseDate):
    #lots of fields
    relateds = models.ManyToManyField('RelatedProduct', verbose_name=_('related products'), blank=True, related_name='order_relateds', through='OrderRelateds')
    # more fields
    total = CurrencyField(verbose_name=_('total'))

    def calculate_total(self):
        cleanses = self.cleanse.taxed_price() * self.quantity
        delivery = DELIVERY_PRICE if self.delivery == 'delivery' else 0
        relateds = 0
        for r in self.relateds.all():
            relateds = relateds + float(r.taxed_price())
        total = float(cleanses) + delivery + relateds
        return total

    def save(self, *args, **kwargs):
        self.total = '%.2f' % self.calculate_total()
        super(Order, self).save(*args, **kwargs)

class OrderRelateds(models.Model):
    order = models.ForeignKey(Order)
    relatedproduct = models.ForeignKey(RelatedProduct, verbose_name=_('related product'))

    class Meta:
        verbose_name = _('Related Product')
        verbose_name_plural = _('Products Related to this Order')

    def __unicode__(self):
        return self.relatedproduct.__unicode__()

    def save(self, *args, **kwargs):
        super(OrderRelateds, self).save(*args, **kwargs)
        self.order.save()

    def delete(self, *args, **kwargs):
        super(OrderRelateds, self).delete(*args, **kwargs)
        self.order.save()
如果订单中添加或删除了任何相关的产品多对多项目,我需要重新计算订单的总价

编辑:这是解决我问题的代码


您可以在包含关系的模型上使用django,并在那里执行相关逻辑

您可以在包含关系的模型上使用django,并在那里执行相关逻辑

蒂米的答案绝对正确,而且有效。但是,对于您的特殊情况,我想知道您是否不应该在视图中处理该逻辑,在视图中您管理订单和订单项并强制执行重新计算,因为订单项的添加、编辑和删除都属于同一个订单。

Timmy的回答绝对正确并且有效。但是,对于您的特殊情况,我想知道您是否不应该在视图中处理该逻辑,在视图中您管理订单和订单项,并在那里强制重新计算,因为订单项的添加、编辑和删除都属于同一个订单。

很难回答,如果您没有指定为什么需要自定义保存和删除,以及在那里应该发生什么。这两种模型的代码也会很有帮助。如果您不指定为什么需要自定义保存和删除以及在那里应该发生什么,那么很难回答。这两种模型的代码也会很有帮助。重新计算总需求在管理中也能起作用以防万一。重新计算总需求在管理中也能起作用以防万一。非常感谢您快速直接的回答。我将附上解决我问题的代码。非常感谢您快速而直接的回答。我会附上解决我问题的代码。
from django.db.models.signals import m2m_changed
from django.dispatch import receiver

@receiver(m2m_changed, sender=Order.relateds.through)
def recalculate_total(sender, instance, action, **kwargs):
    """
    Automatically recalculate total price of an order when a related product is added or removed
    """
    if action == 'post_add':
        instance.save()
    if action == 'post_remove' or action == 'post_clear':
        instance.save()