Как потребовать, чтобы определенному полю передавалось значение при сохранении модели Django

Я пытаюсь отследить, какой пользователь последним обновил объект:

Class MyModel(models.Models):
    updater_id = models.ForeignKey(Users)
    …other fields…

Однако я не могу понять, как потребовать, чтобы updater_id включался каждый раз, когда мой объект сохраняется.

Сначала я попробовал переопределить сохранение:

    def save(self, updater_id, *args, **kwargs):
        self.updater_id = updater_id
        super(MyModel, self).save(*args, **kwargs)

Однако я понял, что это сломает все, что связано с Django (например, MyModel.objects.create())

Далее я попробовал взять его из kwargs:

    def save(self, *args, **kwargs):
        try:
            self.updater_id = kwargs[“update_fields”][“updater_id”]
        catch exception:
            raise Error
        super(MyModel, self).save(*args, **kwargs)

updated_fields, однако, используется крайне редко (т.е. поведение по умолчанию для object.save() - не использовать updated_fields)

Затем я попробовал добавить флаг:

Class MyModel(models.Models):
    updater_id = models.ForeignKey(Users)
    updater_updated_flag = models.BooleanField(default=True, editable=False)  # default=True so first create/save works

    def update_updater_id(self, user_id):
        self.updater_id = user_id
        self.updater_updated_flag = True

    def save(self, *args, **kwargs):
        if self.updater_updated_flag:
            self.updater_updated_flag = False
        else:
            raise Exception("Must call update_updater_id() before calling save on this object")

        super(MyModel, self).save(*args, **kwargs)

Я решил убедиться, что updater_id обновлен до вызова save. Однако я понял, что это нарушит create_or_update(), если я не хочу обернуть это в try catch и, если объект существует, получить объект и вызвать update_updater_id, что уже противоречит всей цели.

Наконец, я попробовал использовать полевой трекер django-model-util:

    def save(self, *args, **kwargs):
        if not self.tracker.has_changed(“updater_id”):
            raise Error
        super(MyModel, self).save(*args, **kwargs)

Иногда, однако, значение не меняется (т.е. тот же пользователь отредактировал его снова).

А теперь у меня нет идей.

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