1

多対多の関係でカスタムの保存および削除メソッドを設定する必要があります。

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

2 に答える 2

6

リレーションを含むモデルで django のm2m_changed,pre_save/post_savepre_delete/post_delete signals利用し、そこで関連するロジックを実行できます。

于 2012-08-16T14:10:42.870 に答える
0

ティミーの答えは間違いなく正しく、機能します。ただし、特別なケースについては、注文と注文アイテムを管理し、そこで再計算を強制するビューでそのロジックを処理しないでください。注文アイテムの追加、編集、削除はすべて一緒に属しているためです。注文に。

于 2012-08-16T14:33:32.350 に答える