名为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: return
和else: pass
。我不明白的是什么?如果实例是None
,我应该做点什么吗?
注意:我意识到要取消名称,因为文件名可能很差。我可能会稍后通过敲击它来修复那个部分。
答案 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)