Django @receiver 装饰器在编辑对象时更新 ForeignKey 对象
Django @receiver decorator update ForeignKey object when object is edited
我有 2 个 类,它们是独立的。 Trade 模型根据与 Trade 对象相关的 Entry 模型对象计算许多统计数据。只有在保存贸易对象时才会计算这些统计数据。
因此,当由于导入过程修改而手动更新条目对象时。我还需要该 Entry 对象向要保存的相关 (ForeignKey) Trade 对象发送信号。否则,用户需要找到该 Trade 对象并单击保存。这将是非常低效的。
这是我当前的设置和错误消息。
这是解决这个问题的正确方法,还是他们对这个 approach/better 替代方案有问题?
models.py
class Trade(models.Model):
...
@receiver(post_save, sender='portfolios.Entry')
def update_trade_object(sender, **kwargs):
trade = Trade.objects.get(pk=kwargs['instance'])
trade.save()
class Entry(models.Model):
...
trade = models.ForeignKey(Trade, on_delete=models.CASCADE, null=True, blank=True)
当前错误:
TypeError: Field 'id' expected a number but got <Entry: Entry object (605)>.
Pk 正在等待数字而不是整个对象。
我认为应该是:instance.pk 或 instance.id .
@receiver(post_save, sender='portfolios.Entry')
def update_trade_object(sender,instance, **kwargs):
trade = Trade.objects.get(pk=instance.pk)
trade.save()
这里kwargs['instance']是保存的Entry实例。如果你想获取与这个入场实例相关的交易实例,你基本上可以这样做:
kwargs['instance'].trade
你这里的方法很好,你检测一个条目何时被保存,并对其进行一些计算。另一种方法可能是覆盖 Entry 模型的 save 方法,但你的方法很好,这也是我在这种情况下所做的。
但是我不明白你为什么在保存条目时保存交易实例。您是否对 Trade save 方法进行了一些特定的计算,或者有另一个 Trade 信号接收器来进行您提到的计算?您可以在保存相关条目时调用该方法来执行您在信号接收器方法中直接提到的计算,而不是在保存相关条目时模拟交易保存方法,但这当然取决于您的代码是如何组织的。
我有 2 个 类,它们是独立的。 Trade 模型根据与 Trade 对象相关的 Entry 模型对象计算许多统计数据。只有在保存贸易对象时才会计算这些统计数据。
因此,当由于导入过程修改而手动更新条目对象时。我还需要该 Entry 对象向要保存的相关 (ForeignKey) Trade 对象发送信号。否则,用户需要找到该 Trade 对象并单击保存。这将是非常低效的。
这是我当前的设置和错误消息。 这是解决这个问题的正确方法,还是他们对这个 approach/better 替代方案有问题?
models.py
class Trade(models.Model):
...
@receiver(post_save, sender='portfolios.Entry')
def update_trade_object(sender, **kwargs):
trade = Trade.objects.get(pk=kwargs['instance'])
trade.save()
class Entry(models.Model):
...
trade = models.ForeignKey(Trade, on_delete=models.CASCADE, null=True, blank=True)
当前错误:
TypeError: Field 'id' expected a number but got <Entry: Entry object (605)>.
Pk 正在等待数字而不是整个对象。
我认为应该是:instance.pk 或 instance.id .
@receiver(post_save, sender='portfolios.Entry')
def update_trade_object(sender,instance, **kwargs):
trade = Trade.objects.get(pk=instance.pk)
trade.save()
这里kwargs['instance']是保存的Entry实例。如果你想获取与这个入场实例相关的交易实例,你基本上可以这样做:
kwargs['instance'].trade
你这里的方法很好,你检测一个条目何时被保存,并对其进行一些计算。另一种方法可能是覆盖 Entry 模型的 save 方法,但你的方法很好,这也是我在这种情况下所做的。
但是我不明白你为什么在保存条目时保存交易实例。您是否对 Trade save 方法进行了一些特定的计算,或者有另一个 Trade 信号接收器来进行您提到的计算?您可以在保存相关条目时调用该方法来执行您在信号接收器方法中直接提到的计算,而不是在保存相关条目时模拟交易保存方法,但这当然取决于您的代码是如何组织的。