保存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。不是一个通用的解决方案,但它为我完成了工作。
我正在尝试跟踪最后更新对象的用户:
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。不是一个通用的解决方案,但它为我完成了工作。