保存Django模型时如何要求特定字段传递一个值

How to require a specific field gets passed a value when saving Django model

我正在尝试跟踪最后更新对象的用户:

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”]
        except:
            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。然而,我意识到这会破坏 create_or_update(),除非我想将它包装在一个 try catch 中,如果对象存在,获取对象并调用 update_updater_id,这已经打败了整个目的。

最后我尝试了 django-model-util 的 fieldtracker:

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

有时,该值不会改变(即同一用户再次编辑)。

现在我没主意了。

我最终使用了 django-currentuser。不是一个通用的解决方案,但它为我完成了工作。