我为学生提供了以下模型,可以将他们的任务上传到我正在创建的应用程序中,但是我有一个问题,我需要在视图之间传递该模型的实例,但是由于该模型不可序列化,所以我可以不能将其保存在会话属性中。请记住,在一个视图中创建对象时没有将其保存在数据库中,而在另一个视图中,我对该对象执行了操作,最后保存了该对象。知道我该怎么做吗?
from gdstorage.storage import GoogleDriveStorage
gd_storage = GoogleDriveStorage()
class Homework(models.Model):
code = models.AutoField(primary_key=True)
student = models.ForeignKey('Student', on_delete=models.PROTECT)
title = models.CharField(unique=True, max_length=100)
attached_file = models.FileField(upload_to='files/homeworks/', validators=[validate_file_size], storage=gd_storage)
答案 0 :(得分:2)
在视图之间保持“状态”的唯一方法是保存到数据库(或其他永久存储)。那就是会议为您做的。
如果您无法序列化以保存在会话中,那么您别无选择,只能将临时对象保存到数据库中。您可以将其标记为临时并添加时间戳。在下一个视图中,将其标记为已提交。并且,如果需要偶尔清理,请删除旧的临时对象。
要删除带有旧临时对象的关联文件,可以为post_delete
信号添加信号处理程序:
from django.core.files.storage import default_storage
@receiver(post_delete, sender=Homework)
def remove_file(sender, instance, **kwargs)
path = instance.attached_file.name
if path:
default_storage.delete(path)
答案 1 :(得分:2)
正如@dirkgroten所说,您可以在模型中添加一个称为状态的附加字段,默认情况下为它分配临时值。除此之外,您还可以查看package code。
最后,将Google云端硬盘中的文件作为存储后端删除非常简单。使用以下
gd_storage.delete(name_file)
因此更改@dirkgroten的代码
from django.core.files.storage import default_storage
@receiver (post_delete, sender=Homework)
def remove_file (sender, instance, **kwargs):
if instance.attached_file is not None:
gd_storage.delete(instance.attached_file.name)