Djangosimplehistory如何向历史记录追加额外的信息/对象?

2024-10-02 20:31:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我在寻找一种方法来改变历史记录中的额外字段。在

我有一个模型Invoice和{}。在

class UserBalanceHistoricalModel(models.Model):

    invoice = models.ForeignKey('Invoice', null=True, blank=True, on_delete=models.SET_NULL,
                                verbose_name='Faktúra')

    class Meta:
        abstract = True

class UserBalance(TimeStampedModel):
    objects = UserBalanceManager()
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE,
                                related_name='user_balance', verbose_name='Užívateľ')
    balance = models.DecimalField(max_digits=12, decimal_places=2, default=0, verbose_name="Eur na konte")
    history = HistoricalRecords(bases=[UserBalanceHistoricalModel, ])

class Invoice(models.Model):
    ...

每次创建Invoice对象时,UserBalance.balance都会被修改并自动创建历史记录。在

我想将这个Invoice对象添加到历史记录中,但它不起作用。invoice_idNone。在

^{pr2}$

你知道我做错了什么吗?在


Tags: nametrueverbose历史记录modelonmodelsinvoice
1条回答
网友
1楼 · 发布于 2024-10-02 20:31:14

balance.history正在访问平衡的HistoryManager类,它本质上是历史模型的管理器,而不是历史模型实例本身。因此,balance.history.invoice = i行只是在manager类上设置一个局部变量,这没有任何效果。在使用balance.save()保存balance之前,不会创建实际的历史模型实例。您要做的是访问pre_create_historical_record信号,它是在保存balance之后,在保存历史实例之前发送的。这是有记录的here。在

对于您的用例,您可以为pre_create_historical_record信号设置一个接收器,它接受history_instance并用您想要的任何值编辑invoice字段。您可以在基本对象上传递invoice,然后按如下方式删除它:

# in apps.py
def add_invoice_to_historical_balance(sender, instance, historical_instance, **kwargs):
    historical_instance.invoice = instance.invoice
    del instance.invoice

class BalanceConfig(AppConfig):
    def ready(self):
        from ..models import HistoricalUserBalance

        pre_create_historical_record.connect(
             add_invoice_to_historical_balance,
             sender=HistoricalUserBalance,
             dispatch_uid='add_invoice_to_historical_balance'
        )

上面的代码如下所示:

^{pr2}$

相关问题 更多 >