django-simple-history,没有历史记录的保存不起作用
django-simple-history, saving without historical record not working
我是 django-simple-history 的忠实粉丝,但是当我在模型的默认 save() 方法中使用它时,我似乎无法使 "save_without_historical_record" 正常工作。
我有这样的模型
class NzPlasmid (models.Model):
...
plasmid_map = models.FileField("Plasmid Map (max. 2 MB)", upload_to="temp/", blank=True)
history = HistoricalRecords()
...
它有一个自定义的 save() 方法,它用新创建的对象的 id 重命名 plasmid_map。为此,我第一次保存对象以获取其 ID,然后使用它重命名 plasmid_map。我不想为第一次保存保存历史记录,而只想为第二次保存。我的自定义 save() 方法如下所示
def save(self, force_insert=False, force_update=False):
self.skip_history_when_saving = True
super(NzPlasmid, self).save(force_insert, force_update)
... some rename magic here ...
del self.skip_history_when_saving
super(NzPlasmid, self).save(force_insert, force_update)
这不起作用,因为每次创建质粒时我仍然会得到 "duplicate" 历史记录。
非常感谢。
第一次保存时,您正在创建对象。但是,根据this line, you can only save without history if the object is being updated, not created. One work around you could try is with a pre_create_historical_record
signal described here。这有点 hacky,但您可以在下面的 apps.py
文件中找到信号处理代码:
def update_plasmid_map_and_save_instance(sender, instance, history_instance):
# instance should have id here
... some rename magic on your instance model...
history_instance.plasmid_map = instance.plasmid_map
instance.save_without_historical_record()
# in apps.py
class TestsConfig(AppConfig):
def ready(self):
from ..models import HistoricalNzPlasmid
pre_create_historical_record.connect(
update_plasmid_map_and_save_instance,
sender=HistoricalNzPlasmid,
dispatch_uid='update_plasmid_map_on_history'
)
然后您就不必在 NzPlasmid
上覆盖 save
。有点老套,但应该可以。
我通过修改 admin.py
中的 save_model
方法解决了这个问题。当创建一个新的有图谱的质粒对象时,由于plasmid_map
的重命名产生了两条历史记录,我删除了第一个,其中包含"wrong" plasmid_map名称,并更改第二个的history_type,从改变(~)到创建(+):
def save_model(self, request, obj, form, change):
rename_and_preview = False
new_obj = False
if obj.pk == None:
if obj.plasmid_map:
rename_and_preview = True
new_obj = True
obj.save()
... some rename magic here ...
if new_obj:
obj.history.last().delete()
history_obj = obj.history.first()
history_obj.history_type = "+"
history_obj.save()
我是 django-simple-history 的忠实粉丝,但是当我在模型的默认 save() 方法中使用它时,我似乎无法使 "save_without_historical_record" 正常工作。
我有这样的模型
class NzPlasmid (models.Model):
...
plasmid_map = models.FileField("Plasmid Map (max. 2 MB)", upload_to="temp/", blank=True)
history = HistoricalRecords()
...
它有一个自定义的 save() 方法,它用新创建的对象的 id 重命名 plasmid_map。为此,我第一次保存对象以获取其 ID,然后使用它重命名 plasmid_map。我不想为第一次保存保存历史记录,而只想为第二次保存。我的自定义 save() 方法如下所示
def save(self, force_insert=False, force_update=False):
self.skip_history_when_saving = True
super(NzPlasmid, self).save(force_insert, force_update)
... some rename magic here ...
del self.skip_history_when_saving
super(NzPlasmid, self).save(force_insert, force_update)
这不起作用,因为每次创建质粒时我仍然会得到 "duplicate" 历史记录。
非常感谢。
第一次保存时,您正在创建对象。但是,根据this line, you can only save without history if the object is being updated, not created. One work around you could try is with a pre_create_historical_record
signal described here。这有点 hacky,但您可以在下面的 apps.py
文件中找到信号处理代码:
def update_plasmid_map_and_save_instance(sender, instance, history_instance):
# instance should have id here
... some rename magic on your instance model...
history_instance.plasmid_map = instance.plasmid_map
instance.save_without_historical_record()
# in apps.py
class TestsConfig(AppConfig):
def ready(self):
from ..models import HistoricalNzPlasmid
pre_create_historical_record.connect(
update_plasmid_map_and_save_instance,
sender=HistoricalNzPlasmid,
dispatch_uid='update_plasmid_map_on_history'
)
然后您就不必在 NzPlasmid
上覆盖 save
。有点老套,但应该可以。
我通过修改 admin.py
中的 save_model
方法解决了这个问题。当创建一个新的有图谱的质粒对象时,由于plasmid_map
的重命名产生了两条历史记录,我删除了第一个,其中包含"wrong" plasmid_map名称,并更改第二个的history_type,从改变(~)到创建(+):
def save_model(self, request, obj, form, change):
rename_and_preview = False
new_obj = False
if obj.pk == None:
if obj.plasmid_map:
rename_and_preview = True
new_obj = True
obj.save()
... some rename magic here ...
if new_obj:
obj.history.last().delete()
history_obj = obj.history.first()
history_obj.history_type = "+"
history_obj.save()