84

ジャンゴについて質問です。

ここにManyToManyモデルがあります

class Product(models.Model):
     name = models.CharField(max_length=255)
     price = models.DecimalField(default=0.0, max_digits=9, decimal_places=2)
     stock = models.IntegerField(default=0)

     def  __unicode__(self):
         return self.name

class Cart(models.Model):
    customer = models.ForeignKey(Customer)
    products = models.ManyToManyField(Product, through='TransactionDetail')
    t_date = models.DateField(default=datetime.now())
    t_sum = models.FloatField(default=0.0)

    def __unicode__(self):
         return str(self.id)

class TransactionDetail(models.Model):
    product = models.ForeignKey(Product)
    cart = models.ForeignKey(Cart)
    amount = models.IntegerField(default=0)

作成された 1 つのカート オブジェクトに対して、新しい TransactionDetail オブジェクト (製品と金額) をいくつでも挿入できます。私の質問はです。トリガーを実装するにはどうすればよいですか? 私が欲しいのは、トランザクションの詳細が作成されるたびに、製品の在庫の量がトランザクションの詳細の量によって差し引かれることです。

post_save() について読んだことがありますが、実装方法がわかりません。多分このようなもの

いつ:

post_save(TransactionDetail, 
       Cart) #Cart object where TransactionDetail.cart= Cart.id
Cart.stock -= TransactionDetail.amount
4

5 に答える 5

179

本当にシグナルを使用してこれを実現したい場合は、簡単にその方法を説明します。

from django.db.models.signals import post_save
from django.dispatch import receiver

class TransactionDetail(models.Model):
    product = models.ForeignKey(Product)

# method for updating
@receiver(post_save, sender=TransactionDetail, dispatch_uid="update_stock_count")
def update_stock(sender, instance, **kwargs):
    instance.product.stock -= instance.amount
    instance.product.save()
于 2012-10-22T17:56:24.157 に答える
20

個人的には、TransactionDetail の save() メソッドをオーバーライドし、そこに新しい TransactionDetail を保存してから実行します

self.product.stock -= self.amount
self.product.save()
于 2012-10-22T17:14:13.810 に答える
2

実際、docstrstring は次のように説明していSignalsますdjango.dispatch.Signal.connect

def connect(self, receiver, sender=None, weak=True, dispatch_uid=None):
    Connect receiver to sender for signal.

    Arguments:

        receiver
            A function or an instance method which is to receive signals.
            Receivers must be hashable objects.

            If weak is True, then receiver must be weak referenceable.

            Receivers must be able to accept keyword arguments.

            If a receiver is connected with a dispatch_uid argument, it
            will not be added if another receiver was already connected
            with that dispatch_uid.

        sender
            The sender to which the receiver should respond. Must either be
            a Python object, or None to receive events from any sender.

        weak
            Whether to use weak references to the receiver. By default, the
            module will attempt to use weak references to the receiver
            objects. If this parameter is false, then strong references will
            be used.

        dispatch_uid
            An identifier used to uniquely identify a particular instance of
            a receiver. This will usually be a string, though it may be
            anything hashable.
于 2018-11-08T04:33:37.123 に答える