Как мне сохранить историческое поле в неисторической модели в Django Simple History?
У меня есть что-то вроде шаблона контракта, общего для всех клиентов, который "управляется версиями" через django-simple-history. У меня есть ClientContract, к которому я хочу прикрепить HistoricalContractTemplate в качестве поля, чтобы я мог определить, как выглядел ContractTemplate во время создания ClientContract.
class ContractTemplate(models.Model):
text = models.TextField()
# Create model 'HistoricalContractTemplate' which stores all changes
history = HistoricalRecords()
class ClientContract(models.Model):
client_text = models.TextField()
contract_template_version = ???? # <------
И после того, как я правильно настрою модель, как мне ее использовать?
def update_client_contract(contract_template_that_will_get_stale):
# ... update other client contract fields
newest_history_record_of_this_contract_template = ??? # <---
client_contract.contract_template_version= newest_history_record_of_this_contract_template
Я думаю, вам нужно настроить модель как внешний ключ, но использовать текстовое имя класса вместо его импорта (не уверен, что его можно импортировать)
class ClientContract(models.Model):
client_text = models.TextField()
# I used protect because hopefully history records aren't being deleted
contract_template_version = models.ForeignKey('HistoricalContractTemplate', models.PROTECT, null=True)
И затем, поскольку .history фильтрует историю только текущего экземпляра клиентского контракта, я думаю, вы можете сделать это:
def update_client_contract(contract_template_that_will_get_stale):
# ... update other client contract fields
newest_history_record_of_this_contract_template = contract_template_that_will_get_stale.history.order_by("history_date").first()
client_contract.contract_template_version= newest_history_record_of_this_contract_template
Можно получить доступ к .model
из .history
, которая является моделью, которую django-simple-history
создал сам:
class ContractTemplate(models.Model):
text = models.TextField()
history = HistoricalRecords()
class ClientContract(models.Model):
client_text = models.TextField()
contract_template_version = models.ForeignKey(ContractTemplate.history.model, on_delete=models.PROTECT)