Я сделал это на других языках, но в данный момент я бью себя по столу. Цель того, что я делаю, состоит в том, чтобы данные не удалялись (никогда), а просто маскировались более новой записью для ведения журнала истории. Прежде чем кто-либо спросит, это требование, а не вариант.
Три поля выглядят следующим образом:
| id | row_id | update_id |
|------|--------|-----------|
| uuid | uuid | uuid |
Концепция этого для отдельной записи: id
никогда не изменитсяна протяжении всей истории этой записи и будет использоваться как официальная ссылка на эту запись.
row_id
является первичным ключом и всегда существует
update_id
является нулевым дляпоследнее обновление записи и в истории она всегда обновляется до записи row_id
, которая его заменила. В этих таблицах есть другие поля, но они не имеют отношения к тому, что я пытаюсь выполнить.
import uuid
from django.db import models
class MyObject(models.Model):
id = models.UUIDField(
auto_created=True,
default=uuid.uuid4,
editable=False,
null=False,
)
row_id = models.UUIDField(
auto_created=True,
default=uuid.uuid4,
editable=False,
primary_key=True,
null=False,
unique=True,
)
update_id = models.UUIDField(
editable=False,
unique=True,
)
Теперь я понял, что MyObject.save () будет вставлять или обновлять запись. Что мне действительно нужно, это вставить новую (поддерживая идентификатор и данные) с новым row_id
..., а затем обновить старую запись, добавив только новый row_id
в столбец update_id
, если он уже существует илипросто вставьте новую запись. Кроме того, я должен убедиться, что новая запись возвращается в место вызова с обновленными идентификаторами.
Если кто-то может помочь мне с этой логикой, это будет здорово ... Я использую Python 3.6 иDjango 2.2.6, спасибо заранее.
ОБНОВЛЕНИЕ 1
Я думаю, я мог бы понять логику ... но я чувствую, что это можно было бы сделать лучше,Размещайте это здесь, и если у кого-то есть что-то лучше, пожалуйста, не стесняйтесь.
def create(cls, id=None, is_deleted=False):
if id is not None and is_deleted is not None:
myObject = cls(id=id, is_deleted=is_deleted)
return myObject
else:
myObject = cls()
return myObject
def save(self, *args, **kwargs):
try:
m_old = MyObject.objects.get(
id=self.id,
update_id=None,
is_deleted=False
)
m_new = MyObject.create(self.id, self.is_deleted)
super(MyObject, m_new).save(*args, **kwargs)
m_old.update_id = m_new.row_id
super(MyObject, m_old).save(*args, **kwargs)
except MyObject.DoesNotExist:
super(MyObject, self).save(*args, **kwargs)