Модель Django / Postgres ORM - PullRequest
       7

Модель Django / Postgres ORM

0 голосов
/ 30 октября 2019

Я сделал это на других языках, но в данный момент я бью себя по столу. Цель того, что я делаю, состоит в том, чтобы данные не удалялись (никогда), а просто маскировались более новой записью для ведения журнала истории. Прежде чем кто-либо спросит, это требование, а не вариант.

Три поля выглядят следующим образом:

|  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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...