В 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
Это неидеально, поскольку исходная таблица будет содержать как окончательно утвержденные записи, так и те, которые предлагается изменить. Есть ли способ создать сущность, хранящую предлагаемые изменения, которая отражала бы структуру исходной сущности?
Есть несколько способов решения этой проблемы
- Измените
Coopна абстрактный базовый класс: https://docs.djangoproject.com/en/4.0/topics/db/models/#abstract-base-classes .
Тогда вы можете унаследовать от него два класса CoopProposed и CoopApplied, и вы можете разработать логику создания каждого из них
- Просто используйте один класс
Coopи добавьте свойствоapprovedпо умолчаниюFalse, а затем установите его вTrueпри утверждении изменений. Это может быть не то, что вы хотите, поскольку это перезапишет все предыдущие изменения, а вы, возможно, захотите сохранить историю изменений.
В любом случае, если вы пытаетесь унаследовать все свойства от Coop, вам нужно понять, как работает наследование моделей Django и все предостережения, прежде чем вас укусят позже:
https://docs.djangoproject.com/en/4.0/topics/db/models/#model-inheritance