我有一个关于Django 的问题.

我这里有很多很多的模特

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对象(产品和金额).我的问题是.我如何实现触发器?我想要的是,每当创建一个交易细节时,我想要用transactiondetail中的金额减go 产品的库存金额.

我读过post_save(),但我不确定如何实现它. 也许是像这样的东西.

什么时候:

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

推荐答案

如果你真的想用信号来实现这一点,下面简单介绍一下,

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

Django相关问答推荐

Django模型ManyToManyField.Add不起作用

Django没有显示变量

使用自定义模型注册后,Django无法登录

注册新用户时,对象没有属性';is_active';错误:';NoneType';对象没有属性

未强制执行枚举值

Django Rest Framework 认证类覆盖 request.user

root urls.py 是 Django 中的 config/urls.py 吗?

在 Django 的 TextField 中禁用 HTML 转义

Django 管理命令参数

目前使用 Django Evolution,South是否更好,值得切换?

Django中视图的多个decorator :执行顺序

Django rest-auth allauth 注册,带有邮箱、名字和姓氏,没有用户名

CherryPy 与 Django

Django 模板列表的第一个元素

Django:获取上次用户访问日期

Python:获取异常的错误消息

在 docker 容器中创建 django 超级用户而不输入密码

django 模板列表变量中的最后一个元素

Django 发送邮箱

django.db.utils.OperationalError 无法连接到服务器