我有两个这样的模型:
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')))
答案 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()
您的新对象。