还有Django pre_save信号需要吗?

时间:2017-12-11 09:53:37

标签: django signals

名为Scorecard的模型。记分卡具有唯一的name CharField。我将.csv文件保存到媒体文件夹。我正在尝试创建一个pre_save信号,该信号获取旧名称(因为它可能已更改)并检查媒体中的.csv文件以将其删除。

当下面的信号代码被注释掉并且我创建了一个新实例时,会根据需要在我的媒体文件夹中创建.csv。

当我取消注释下面的信号时,只有在编辑和保存现有实例时才会输出.csv文件,但是在我创建实例时不会输出。

@receiver(pre_save, sender=Scorecard)
def file_delete_handler(sender, instance, **kwargs):
    print('INSTANCE ID:', instance.pk)
    if instance.pk is not None:
        old = Scorecard.objects.get(pk=instance.pk)
        print(old.name)
        file_path = os.path.join(MEDIA_ROOT, ''.join([old.name, '.csv']))
        if os.path.exists(file_path):
            os.remove(file_path)

我怀疑这与没有其他的if语句有关吗?我已经尝试了else: returnelse: pass。我不明白的是什么?如果实例是None,我应该做点什么吗?

注意:我意识到要取消名称,因为文件名可能很差。我可能会稍后通过敲击它来修复那个部分。

1 个答案:

答案 0 :(得分:0)

这有效:

@receiver(pre_save, sender=Scorecard)
def file_delete_handler(sender, instance, **kwargs):
    try:
        old = Scorecard.objects.get(pk=instance.pk)
        if old.name != instance.name:
            # name has been changed
            file_path = os.path.join(MEDIA_ROOT, ''.join([old.name, '.csv']))
            if os.path.exists(file_path):
                os.remove(file_path)
    except:
        pass

不是这个:

@receiver(pre_save, sender=Scorecard)
def file_delete_handler(sender, instance, **kwargs):
    print('INSTANCE ID:', instance.pk)
    if instance.pk is not None:
        old = Scorecard.objects.get(pk=instance.pk)
        print(old.name)
        file_path = os.path.join(MEDIA_ROOT, ''.join([old.name, '.csv']))
        print(file_path)
        if os.path.exists(file_path):
            print('Deleting: {}'.format(file_path))
            os.remove(file_path)
    else:
        print('Instance equals None, do nothing!')

我试图解决的问题是:我有芹菜任务最终从API下载数据,然后Pandas获取该数据并使用to_csv(...)将数据保存到我的/media/文件夹。我试图做的是,如果有人编辑现有对象并更改其名称,请删除/ media /中的旧文件,因为名称为" name" .csv。

我认为pre_save,芹菜延迟和我在save_model中定义admin.ModelAdmin的组合是原因,但我不完全理解事件。

class ScorecardAdmin(admin.ModelAdmin):
    ...
        result = get_report.delay(name, start, end, type)
        set_task_status.delay(result.task_id)
        obj.task_id = result.task_id
    super().save_model(request, obj, form, change)