Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
还需要Django pre_保存信号吗?_Django_Signals - Fatal编程技术网

还需要Django pre_保存信号吗?

还需要Django pre_保存信号吗?,django,signals,Django,Signals,模型名为记分卡。记分卡的名称字符域具有唯一性。我将.csv文件保存到媒体文件夹。我正在尝试创建一个pre_save信号,该信号获取旧名称(因为它可能已更改),并检查媒体中的.csv文件以将其删除 当我下面的信号代码被注释掉并且我创建了一个新实例时,一个.csv将根据需要在我的媒体文件夹中创建 当我取消注释下面的信号时,仅在编辑和保存现有实例时输出.csv文件,而在创建实例时不输出.csv文件 @receiver(pre_save, sender=Scorecard) def file_delet

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

当我下面的信号代码被注释掉并且我创建了一个新实例时,一个.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?我尝试了
else:return
else:pass
。我不明白什么?如果实例是
None
,我应该做些什么吗

注意:我意识到去掉文件名可能是一种糟糕的做法。稍后我可能会通过敲击或其他方式来修复该部件。

此方法有效:

@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
、芹菜延迟,以及我在
admin.ModelAdmin
中定义的
save_model

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)

... 它只是在编辑一个现有的时才这样做,因为这是你明确告诉它要做的,当然?在处理信号时,我是否必须明确说明当instance.pk为None时该做什么,或者它应该继续到.save()?我真的不明白你想要在这里做什么。如果您希望在无和非无时发生相同的事情,请不要使用If语句。