Python Django simple history如何向历史记录附加额外的信息/对象?
我正在寻找一种方法来改变历史记录中的额外字段 我有一个型号的Python Django simple history如何向历史记录附加额外的信息/对象?,python,django,django-simple-history,Python,Django,Django Simple History,我正在寻找一种方法来改变历史记录中的额外字段 我有一个型号的发票和余额 class UserBalanceHistoricalModel(models.Model): invoice = models.ForeignKey('Invoice', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='Faktúra') class Meta:
发票
和余额
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\u id
为None
In [10]: u = User.objects.first()
In [11]: i = Invoice.objects.first()
In [12]: balance = u.user_balance
In [13]: balance.balance = 45
In [16]: balance.history.invoice = i
In [18]: balance.save()
In [28]: balance.history.all().values_list('invoice_id',flat=True)
Out[28]: <QuerySet [None, None, None, None]>
[10]中的u=User.objects.first()
在[11]中:i=Invoice.objects.first()
在[12]中:余额=u.user\u余额
在[13]中:balance.balance=45
在[16]中:balance.history.invoice=i
在[18]中:balance.save()
在[28]中:balance.history.all().values\u list('invoice\u id',flat=True)
出[28]:
你知道我做错了什么吗
balance.history
正在访问balance的HistoryManager
类,它本质上是历史模型的管理器,而不是历史模型实例本身。因此,行balance.history.invoice=i
只是在manager类上设置了一个局部变量,这没有任何效果。使用balance.save()
保存balance之前,不会创建实际的历史模型实例。您要做的是访问pre\u create\u historical\u record
信号,该信号在保存余额之后,但在保存历史实例之前发送。这是有案可查的
对于您的用例,您可以为pre\u create\u historical\u record
信号设置接收器,该信号接受history\u实例
,并使用您想要的任何值编辑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'
)
上面的代码如下所示:
In [10]: u = User.objects.first()
In [11]: i = Invoice.objects.first()
In [12]: balance = u.user_balance
In [13]: balance.balance = 45
In [16]: balance.invoice = i
In [18]: balance.save()