【问题标题】:increment another model field using django signals使用 django 信号增加另一个模型字段
【发布时间】:2018-09-14 15:55:31
【问题描述】:

我有两个模型,AB。每当我在 model B 中插入另一个值时,我想增加 model A 的一个字段中的值。我正在使用 post_save 信号,但我不断收到此错误“'update_fields' is an invalid keyword argument for this function”

下面是我的代码,谢谢你的帮助。

class Sales(models.Model):
    id = models.AutoField(primary_key=True) 
    order_details = models.ForeignKey(GeneralConsulting)    
    medication_name_id = models.ForeignKey(Medication_List)
    dosage = models.CharField(max_length=10,  blank=True)
    duration = models.CharField(max_length=10,  blank=True)
    quantity = models.IntegerField(default=0)
    ...


@receiver(signals.post_save, sender=Sales)
class Product(models.Model):
    id = models.AutoField(primary_key=True)
    product_name = models.ForeignKey(Medication_List)
    description = models.TextField(blank=True)
    supplier = models.ManyToManyField(Supplier, blank=True)
    expiration_date = models.DateField(blank=False, null=True )
    ...
    quantity_sold = models.IntegerField(default=0)  
    minimum_stock_level = models.IntegerField(default=1)



    def add_on(self, sender, created, instance, update_fields, **kwargs ):
        if created or update_fields is 'quantity':    
            b = Product.objects.get(product_name_id=instance.id)
            if b.quantity_sold + instance.quantity <= b.initial_qty:
                b.quantity_sold = b.quantity_sold + instance.quantity
            b.save(update_fields=['quantity_sold'])

所以我想做的就是增加 Product.quantity_sold 字段中的值 每当添加新的销售时。

请帮助,我对 django 信号很陌生。有一个更好的方法吗?谢谢

【问题讨论】:

  • 你能改变@receiver(signals.post_save, sender=Sales) => @receiver(models.signals.post_save, sender=Sales) 吗?
  • 嗯,运气不好。再次弹出同样的错误

标签: python django django-models relational-database django-signals


【解决方案1】:

重写Sales 类的save 方法怎么样?例如:

class Sales(models.Model):
    id = models.AutoField(primary_key=True) 
    order_details = models.ForeignKey(GeneralConsulting)    
    medication_name_id = models.ForeignKey(Medication_List)
    dosage = models.CharField(max_length=10,  blank=True)
    duration = models.CharField(max_length=10,  blank=True)
    quantity = models.IntegerField(default=0)

    def save(self, *args, **kwargs):
        p = Product.objects.get(product_name=self.medication_name_id)
        p.quantity_sold += self.quantity
        p.save()
        super(Sales, self).save(*args, **kwargs)

基本上,每当您必须保存新的销售时,您都会在保存之前增加相关产品的quantity_sold。我假设您通过Medication_List 获得与销售相关的产品。

警告:您调用 save 方法也可以更新预先存在的对象。如果您计划更新现有销售,您需要的不仅仅是上面的代码。否则,您将增加产品的 quantity_sold 也只是为了销售更新。

【讨论】:

  • 我对你的代码有点困惑,我认为super(Sales, self).save(*args, **kwargs) 将保存回销售模型,我不知道如何保存到产品模型。无论如何我会试试看。
  • @HamzaBawumia 我刚刚更新了我的答案。希望对你有帮助!
  • 它对我不起作用,产品模型已经在导入销售模型,所以我无法将销售模型重新导入产品模型。 .这就像一个周期性的导入错误。 A 进口 B 和 B 再次进口 A。大声笑,无论如何感谢您的技巧,我想我会在另一个项目中使用它。
猜你喜欢
  • 2021-11-19
  • 2018-04-14
  • 2019-03-11
  • 1970-01-01
  • 2021-10-05
  • 2016-02-28
  • 2019-09-04
  • 2015-09-26
  • 1970-01-01
相关资源
最近更新 更多