多対多の関係でカスタムの保存および削除メソッドを設定する必要があります。
"through" 属性を使用してモデルを指定しようとしましたが、これによりコードが複雑になりすぎて、いくつかの問題が発生しました。多対多モデルに追加のフィールドは必要ありません。カスタムの save メソッドと delete メソッドだけが必要です。
「スルー」属性を指定せずにこれを達成することは可能ですか?
コードは次のとおりです。
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()
関連商品 (多対多の商品) が注文に追加または削除された場合、注文の合計金額の再計算をトリガーする必要があります。
編集:これは私の問題を解決したコードです
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()