【问题标题】:Django Error: 'RelatedManager' object has no attribute 'save'Django 错误:“RelatedManager”对象没有属性“保存”
【发布时间】:2019-04-06 11:17:04
【问题描述】:

这是我的模型:

class Stock_Total(models.Model):
    purchases   = models.ForeignKey(Purchase,on_delete=models.CASCADE,null=True,blank=True,related_name='purchasetotal')
    stockitem   = models.ForeignKey(Stockdata,on_delete=models.CASCADE,null=True,blank=True,related_name='purchasestock') 
    gst_rate    = models.DecimalField(max_digits=4,decimal_places=2,default=5)

@receiver(pre_save, sender=Stock_Total)
def update_gst_rate(sender, instance, *args, **kwargs):
    instance.gst_rate = instance.stockitem.gst_rate

@receiver(post_save, sender=Purchase)
def trigger_gst(sender, instance, *args, **kwargs):
    instance.purchasetotal.save()

“Purchase”和“Stockdata”是我创建的其他模型...我只想在保存购买模型时保存 Stock_Total 模型,即当我点击保存购买模型时,Stock_Total 模型将自动更新连同购买模型...

有人知道吗?

【问题讨论】:

  • instance.purchasetotal 是一对多的关系,它可以引用零个、一个或多个项目。但是调用.save() 没有任何意义,因为您基本上会要求数据库“使用表中已有的值更新表中的字段”。
  • 还有其他方法吗???

标签: python django django-models django-signals


【解决方案1】:

我只想在保存 Purchase 模型时保存 Stock_Total 模型

你不需要信号。见下文;名称已更改以保护PEP 8

class StockTotal(models.Model):
    purchases = models.ForeignKey(
        Purchase,
        on_delete=models.CASCADE,
        null=True,
        blank=True,
        related_name='stock_totals',
    )
    # ...


class Purchase(models.Model):
    # ...

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)

        for total in self.stock_totals.all():
            # Do whatever updates you want here
            total.save()

注意这里的total 值将是数据库值; [related_name].all() 调用将重新检索它们。

我不太清楚你想做什么。如果要在保存关联的Purchase 对象时编辑StockTotal 实例上的值,这将起作用;如果您只是想确保维护 m2m 关系,则无需为此做任何事情。

如果这没有帮助,请编辑您的问题以澄清。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 2021-11-24
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    相关资源
    最近更新 更多