В Django, как создать модель, которая хранит предлагаемые изменения в другой модели?

Я использую Python 3.9 и Django 3.2. У меня есть следующая модель

class Coop(models.Model):
    objects = CoopManager()
    name = models.CharField(max_length=250, null=False)
    types = models.ManyToManyField(CoopType, blank=False)
    addresses = models.ManyToManyField(Address, through='CoopAddressTags')
    enabled = models.BooleanField(default=True, null=False)
    phone = models.ForeignKey(ContactMethod, on_delete=models.CASCADE, null=True, related_name='contact_phone')
    email = models.ForeignKey(ContactMethod, on_delete=models.CASCADE, null=True, related_name='contact_email')
    web_site = models.TextField()
    description = models.TextField(null=True)
    approved = models.BooleanField(default=False, null=True)

Мы хотим создать ситуацию, когда кто-то может предложить изменение строки в базе данных, которое будет рассмотрено перед сохранением, поэтому я создал эту строку

class CoopChange(Coop):
    """
    """
    created_at = models.DateTimeField(null=False, default=datetime.now)

Проблема в том, что когда я создаю миграцию, создаваемая таблица просто указывает обратно на исходную модель, вместо того, чтобы хранить все поля

        Table "public.directory_coopchange"
   Column    |           Type           | Modifiers 
-------------+--------------------------+-----------
 coop_ptr_id | integer                  | not null
 created_at  | timestamp with time zone | not null

Это неидеально, поскольку исходная таблица будет содержать как окончательно утвержденные записи, так и те, которые предлагается изменить. Есть ли способ создать сущность, хранящую предлагаемые изменения, которая отражала бы структуру исходной сущности?

Есть несколько способов решения этой проблемы

  1. Измените Coop на абстрактный базовый класс: https://docs.djangoproject.com/en/4.0/topics/db/models/#abstract-base-classes
  2. .

Тогда вы можете унаследовать от него два класса CoopProposed и CoopApplied, и вы можете разработать логику создания каждого из них

  1. Просто используйте один класс Coop и добавьте свойство approved по умолчанию False, а затем установите его в True при утверждении изменений. Это может быть не то, что вы хотите, поскольку это перезапишет все предыдущие изменения, а вы, возможно, захотите сохранить историю изменений.

В любом случае, если вы пытаетесь унаследовать все свойства от Coop, вам нужно понять, как работает наследование моделей Django и все предостережения, прежде чем вас укусят позже: https://docs.djangoproject.com/en/4.0/topics/db/models/#model-inheritance

Вернуться на верх