Я работаю над приложением Django, где мне нужно записывать и сохранять данные пользователя, когда они завершают действие.
Чтобы использовать аналогию, скажем, у меня есть модель Address что-то вроде:
class Address(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
street = models.CharField(max_length=100)
town = models.CharField(max_length=50)
...
И так далее. Пользователь может изменить свой адрес в любое время.
Когда они завершают действие, мне нужно создать квитанцию с подробным описанием их адреса в то время.
Если бы я создал модель Receipt
с полем address
как ForeignKey
вот так:
class Receipt(models.Model):
ref_num = models.UUIDField(default=uuid.uuid4, editable=False)
date = models.models.DateTimeField(auto_now_add=True)
user = models.ForeignKey(User, on_delete=models.CASCADE)
address = models.ForeignKey(Address, on_delete=models.CASCADE)
Квитанция будет правильной на момент создания, но если пользователь затем изменит свой адрес, она будет неверной.
Является ли решение создать модель Receipt
, дублирующую все поля в модели Address
, чтобы их можно было сохранить?
class Receipt(models.Model):
ref_num = models.UUIDField(default=uuid.uuid4, editable=False)
date = models.models.DateTimeField(auto_now_add=True)
user = models.ForeignKey(User, on_delete=models.CASCADE)
street = models.CharField(max_length=100)
town = models.CharField(max_length=50)
...
Я предполагаю, что есть менее подробный и более элегантный способ добиться этого. Мне нужно создать моментальный снимок адреса пользователя в данный момент времени, в основном, без создания дубликата Address
, так как они редактируются пользователем.
Невозможно создать моментальный снимок без дубликатов, вы можете свести данные к минимуму, отслеживая только те поля, которые изменились. Но если вы делаете это и хотите знать, какой адрес был для экземпляра, вам нужно вернуться ко всем изменениям, которые были сделаны.
Я полагаю, что мог бы продублировать экземпляр модели
Address
с добавленным полем, чтобы указать, был ли это редактируемый пользователем адрес или адрес получения. Только первый будет отображаться в учетной записи пользователя и доступен для редактирования.