将文件从一个模型复制到另一个模型

时间:2011-10-31 10:09:01

标签: django

我有两个这样的模型:

class A(models.Model):
    attachment = FileField(upload_to='a')

class B(models.Model):
    attachment = FileField(upload_to='b')

我有 A 模型的实例:

a = A.objects.get(pk=1)

我需要创建 B 模型的实例,并从 a 实例复制文件。

我该怎么做?

我正在尝试这样的事情,但它不起作用:

from django.core.files import File
B.objects.create(attachment=File(open(a.attachment.path, 'rb')))

3 个答案:

答案 0 :(得分:3)

奇怪的是。现在我尝试过的方式完美无缺,没有任何错误。 也许我第一次错过了什么。所以它有效:

from django.core.files import File
B.objects.create(attachment=File(open(a.attachment.path, 'rb')))

答案 1 :(得分:2)

我有同样的问题并且像这样解决了,希望它可以帮助任何人:

# models.py

class A(models.Model):
    # other fields...
    attachment = FileField(upload_to='a')

class B(models.Model):
    # other fields...
    attachment = FileField(upload_to='b')

# views.py or any file you need the code in

try:
    from cStringIO import StringIO
except ImportError:
    from StringIO import StringIO
from django.core.files.base import ContentFile
from main.models import A, B

obj1 = A.objects.get(pk=1)

# You and either copy the file to an existent object
obj2 = B.objects.get(pk=2)

# or create a new instance
obj2 = B(**some_params)

tmp_file = StringIO(obj1.attachment.read())
tmp_file = ContentFile(tmp_file.getvalue())
url = obj1.attachment.url.split('.')
ext = url.pop(-1)
name = url.pop(-1).split('/')[-1]  # I have my files in a remote Storage, you can omit the split if it doesn't help you
tmp_file.name = '.'.join([name, ext])
obj2.attachment = tmp_file

# Remember to save you instance
obj2.save()

答案 2 :(得分:0)

您的代码正在运行,但不会创建新文件。

要创建新文件,您应该考虑shutil.copy():http://docs.python.org/library/shutil.html

此外,如果您复制文件,其名称必须与前一个名称不同,或者如果您在另一个目录中创建该文件,则可以保留相同的名称。它取决于你想要的......

所以你的代码变成了:

from shutil import copy
B.objects.create(attachment=copy(a.attachment.path, 'my_new_path_or_my_new_filename'))

另外,请不要忘记.save()您的新对象。