还需要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语句。