【问题标题】:How to pass an object between views in Django如何在Django中的视图之间传递对象
【发布时间】:2019-03-17 12:51:32
【问题描述】:

我有以下模型供我的学生将他们的任务上传到我正在创建的应用程序,但我有一个问题,我需要在视图之间传递模型的实例,但由于它不可序列化,我可以不要将其保存在会话属性中。请记住,在一个视图中,我创建对象而不将其保存在数据库中,而在另一个视图中,我对对象执行操作,最后保存它。知道我该怎么做吗?

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)

【问题讨论】:

    标签: python django google-drive-api filefield


    【解决方案1】:

    正如@dirkgroten 所说,您可以在模型中添加一个称为状态的附加字段,并默认为其分配临时值。除此之外,您还可以查看package code

    最后删除作为存储后端的 Google Drive 中的文件非常简单。使用以下

    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)
    

    【讨论】:

    • 他们拯救了我的一周。几天来我一直在尝试类似的东西,但没有得到任何东西。谢谢你。
    【解决方案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)
    

    【讨论】:

    • 我想过这个解决方案,但它会自动在 Google Drive Storage 中创建一个文件,我还没有找到删除保存在那里的文件的方法,这会损害存储空间。
    • 我不明白你为什么不能删除。 django doesn't automatically delete associated files when the model is deleted 是真的,但没有什么能阻止你这样做。
    • 我试图删除一个,但文件仍然存在。这是保存文件的内容。 Django Google Drive Storage 虽然它给了我一个想法,即创建一个存储站点不同的临时作业模型,然后通过存储在谷歌驱动器中的另一个模型中创建它们
    • 啊 Google Drive Storage,不是 Google Cloud Storage。我没有使用 Google Drive 作为存储后端的经验,所以我建议您深入研究软件包的源代码,看看它是如何删除文件的。
    • 感谢您的方法,我将通过添加它们在其他答案中指示的内容来使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2013-03-09
    • 1970-01-01
    • 2018-06-22
    • 2011-12-07
    • 2011-04-26
    • 1970-01-01
    相关资源
    最近更新 更多