django-simple-history, сохранение без исторической записи не работает

Я большой поклонник django-simple-history, но мне кажется, что я не могу заставить "save_without_historical_record" работать должным образом, когда использую его внутри метода save() модели по умолчанию.

У меня есть такая модель

class NzPlasmid (models.Model):
    ...
    plasmid_map = models.FileField("Plasmid Map (max. 2 MB)", upload_to="temp/", blank=True)
    history = HistoricalRecords()
    ...

У него есть собственный метод save(), который переименовывает plasmid_map с идентификатором вновь созданного объекта. Для этого я в первый раз сохраняю объект, чтобы получить его идентификатор, а затем использую его для переименования 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)

что не работает, так как я до сих пор получаю "повторяющиеся" исторические записи каждый раз, когда создается плазмида.

Заранее большое спасибо.

2 ответа

Решение

Я решил проблему, изменив save_model метод в моем admin.py, Когда создается новый объект плазмиды с картой, генерируется две исторические записи из-за переименования plasmid_mapЯ удаляю первый, который содержит "неправильное" имя 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()

При первом сохранении вы создаете объект. Однако, согласно этой строке, вы можете сохранить без истории, только если объект обновляется, а не создается. Одна из работ, которую вы можете попробовать, это с pre_create_historical_record Сигнал описан здесь. Это немного глупо, но вы можете иметь код обработки сигналов в вашем 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'
         )

И тогда вам не придется переопределять save на NzPlasmid, Это немного глупо, но это должно сработать.

Другие вопросы по тегам