强制深度复制Django FileField对象(主要是新文件本身) [英] Force deep copy of Django FileField object (mainly new file itself)

查看:153
本文介绍了强制深度复制Django FileField对象(主要是新文件本身)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这个模型:

class DocVersion(Commentable):

    name = models.CharField(
        'Version',
        max_length=100,
    )

    docfile = models.FileField(
        'File',
        upload_to='content/%Y/%m/%d/%H/%M/%S',
    )

    created = models.DateTimeField(
        'Created',
        auto_now_add=True,
    )

    creater = models.ForeignKey(
        User,
    )

class Document(DocumentBase):

    #..... blah .....

    versions = models.ManyToManyField(
        DocVersion,
    )

在视图中的函数中,我可以使用此函数对DocVersion进行深层复制,如下所示:

In a function in a view, I have this function to do a deep copy of the DocVersion like so:

def cp_document(transfer_object_id, parent_folder_id):
    document = Document.objects.get(pk=transfer_object_id)
    versions = []
    for version in document.versions.all():
        version.pk = None
        version.save()
        versions.append(version)
    document.pk = None
    document.parent = Folder.objects.get(pk=parent_folder_id)
    document.save()
    for version in versions:
        document.versions.add(version)
    document.save()

当我在cp_document()中为版本复制时,它会创建一个新字段,但仍保留该版本文件字段的相同路径.是否可以触发DocVersion创建具有新文件和路径的新版本(理想情况下,使用与我在upload_to参数中指定的相同的目录结构时间格式)?还是有其他方法可以做到这一点?

When I do the copy for the versions in cp_document(), it does create a new field but still keeps the same path for the version's file field. Is it possible to trigger DocVersion to create a new version with a new file and path (ideally using the same time formats for directory structure as I have designated in the upload_to parameter)? Or is there some other way to do this possibly?

推荐答案

对此:

from django.core.files.base import ContentFile

...

def cp_document(user, transfer_object_id, parent_folder_id):

    document = Document.objects.get(pk=transfer_object_id)
    versions = []

    for version in document.versions.all():

        dv = DocVersion()
        dv.name = version.name
        dv.docfile = ContentFile(version.docfile.read())
        dv.docfile.name = version.docfile.name
        dv.creater = user
        dv.save()
        versions.append(dv)

    document.pk = None
    document.parent = Folder.objects.get(pk=parent_folder_id)
    document.save()

    for version in versions:
        document.versions.add(version)
    document.save()

希望这对某人有帮助.

这篇关于强制深度复制Django FileField对象(主要是新文件本身)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆