Как я могу записать создание, редактирование, уничтожение экземпляра в удобном месте? - PullRequest
0 голосов
/ 04 октября 2018

У меня есть модель Machine:

class Machine(models.Model):
    name = models.CharField(max_length=12)
    type = models.ForeignKey(to=TypeModel)
    using = models.BooleanField(default=False)
    group = models.ManyToManyField()

Я хочу записать записи Machine экземпляра create, update и destroy.Итак, у меня есть модель MachineRecord:

class MachineRecord(models.Model):
    editor = models.ForeignKey(to=User)
    machine = models.ForeignKey(to=Machine)
    old_content = models.CharField(max_length=1024, null=True, blank=True)
    new_content = models.CharField(max_length=1024, null=True, blank=True)
    ctime = models.DateTimeField(auto_now_add=True)

Но моя проблема в том, что есть много мест для создания и обновления экземпляра Machine.Могу ли я создать экземпляр MachineRecord для экземпляра Machine в централизованном месте, например, в классе Machine?

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


EDIT-01

Есть много высказываний, переписывающих метод save () машины:

class Machine(models.Model):
  ...
  def save(*args, **kwargs):
    before_do_something()
    super().save(*args, **kwargs)
    after_do_something()

но как насчетManyToManyField?Я также хочу записать краткое описание групп в old_content и new_content.

, и что более важно, editor - это request.user (который вызывает UpdateAPI).

1 Ответ

0 голосов
/ 04 октября 2018

Сигналы Django могут использоваться для этого.

Вы можете зарегистрировать слушателя на такие события, как pre_save, post_save, post_delete и др.

Вы даже можете создавать свои собственные сигналы.

Документы: https://docs.djangoproject.com/en/2.1/topics/signals/

Единственным недостатком может быть то, что может быть трудно отследить проблему (если она возникает), особенно если больше людей работают над проектом и не знают об использовании сигналов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...