Django:用于多对多关系的自定义保存方法 [英] Django: Custom Save method for Many-to-Many relation

查看:105
本文介绍了Django:用于多对多关系的自定义保存方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I need to set custom save and delete methods on a Many-to-Many relation.

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

I tried specifying a model with the "through" attribute but this over-complicated my code and introduced some problems. I don't need any extra field on the Many-to-Many model, just custom save and delete methods.

是否可以在不指定通过属性?

Is it possible to accomplish this without specifying the "through" attribute?

这里是代码:

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()

我需要触发重新计算如果添加相关产品(许多项目)t的订单总价格t o或从订单中删除。

I need to trigger recalculation of total price of the order if any related product (many to many item) is added to or removed from an order.

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

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()


推荐答案

您可以使用django的< a href =https://docs.djangoproject.com/en/dev/ref/signals/ =noreferrer> m2m_changed 包含关系的模型的pre_save / post_save pre_delete / post_delete信号 ,并执行相关的逻辑 那里。

You could make use of django's m2m_changed, pre_save/post_save, pre_delete/post_delete signals on the Model containing the relation, and do the related logic there.

这篇关于Django:用于多对多关系的自定义保存方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆