0

私はdjangoでeコマースを開発しています。問題は、Order および RowOrder の計算に関するものです。

class Order(Model):
    STATUS = {
        'NPAI': 'Not paid',
        'PAID': 'Paid',
        'SHIP': 'Shipped',
    }
    status = CharField(max_length=4, choices=STATUS.items(), editable=False, default='NPAI')
    cod = CharField(max_length=30, unique=True, db_index=True, editable=False)

    total_price = DecimalField(max_digits=4, decimal_places=2, default=Decimal('0.00'), editable=False)
    vat = DecimalField(max_digits=4, decimal_places=2, default=Decimal('0.00'), editable=False)
    [...]

class RowOrder(Model):
    article = ForeignKey(Article)
    order = ForeignKey(Order)
    [...]
     def save(self, *args, **kwargs):
        # update order
        with transaction.commit_on_success():
            order_Locked = Order.objects.select_for_update().get(id=self.order.id)
            order_Locked.total_price += self.price
            order_Locked.vat_price += self.price - self.price/(1 + order_Locked.vat/100)
            order_Locked.save()

ご覧のとおり、 roworderが保存されるたびにorder の値を更新します。これはうまくいきますが、注文が作成されたときに注文確認メールを送信する必要がありますが、Order.save() でメールを送信すると:

def save(self, *args, **kwargs):
        if self.status == 'NPAI':
            super(Order, self).save(*args, **kwargs)
            send_order_confirm(self)

その場合、当然のことながら、その時の self.roworder_set は空です。間違ったアプローチを選択したか、実際に目標を達成するためにできることはありますか? どうもありがとう。

4

2 に答える 2

0

akshar raaj のコメントのおかげで、問題は解決したと思います。

モデルではなく、django-admin からイベントをトリガーする必要があります。

class OrderAdmin(ModelAdmin):

    [...]

    def save_formset(self, request, form, formset, change):
        super(OrderAdmin, self).save_formset(request, form, formset, change)
        order = formset.instance
        if order.status == 'NPAI':
            send_order_confirm(order)

django 公式ドキュメントへの便利なリンク

ビューからそのイベントが必要な場合は、ビューで send_order_confirm を直接呼び出すことができます

于 2013-07-08T14:46:18.237 に答える