我正在使用 Django 2.1.1。
我有一个模型Analysis,其中包含一个MyFile模型的外键(我编写的用于处理文件的模型):
from polymorphic.models import PolymorphicModel
from django.db.models import Model, DateTimeField, FileField, SET_NULL
from django.db.models.signals import pre_delete
class MyFile(Model):
file = FileField(upload_to='./', null=False, blank=False)
description = CharField(max_length=255, null=True, blank=True)
date_added = DateTimeField(auto_now_add=True)
@receiver(pre_delete, sender=MyFile)
def mymodel_delete(sender, instance, **kwargs):
"""
To delete the file connected to the `sender` class: receive the pre_delete signal
and delete the file associated with the model instance.
"""
instance.file.delete(False)
class Analysis(PolymorphicModel):
# ... other fields ...
file_results = ForeignKey(MyFile, on_delete=SET_NULL,
related_name='file_results',
null=True, blank=True)
Analysis是一个PolymorphicModel与更大项目相关的原因。
在Analysis.file_results我设置中,on_delete=SET_NULL因为我希望Analysis即使没有 也允许实例存在file_result,稍后可以填充。
假设我添加了一些文件(MyFile表格有几行)和一些Analysis实例。现在,如果我想删除与Analysis我执行的实例之一相关的文件:
a = Analysis.objects.get(pk=0)
a.file_results.delete()
a.save()
但我收到以下错误:
File "/Users/mtazzari/djangos/views.py" in update_job_refs
377. a.save()
File "/Users/mtazzari/anaconda/envs/djangos/lib/python3.6/site-packages/polymorphic/models.py" in save
83. return super(PolymorphicModel, self).save(*args, **kwargs)
File "/Users/mtazzari/anaconda/envs/djangos/lib/python3.6/site-packages/django/db/models/base.py" in save
670. "unsaved related object '%s'." % field.name
ValueError: save() prohibited to prevent data loss due to unsaved
related object 'file_results'.
当文件实际上从文件系统中删除时,mymodel_delete在pre_delete信号上调用的函数可以正常工作。但是,我真的不明白如何解决ValueError.
但是,这是这样做的正确方法吗?删除相关对象的最佳做法是什么?
叮当猫咪
相关分类