Как потребовать, чтобы определенному полю передавалось значение при сохранении модели 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)
Иногда, однако, значение не меняется (т.е. тот же пользователь отредактировал его снова).
А теперь у меня нет идей.