Как мне сохранить историческое поле в неисторической модели в 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)
Вернуться на верх