Abd*_*auf 5 python django filefield django-file-upload
我的模型中有一个 DjangoFileField。我正在尝试将该 FielField 中的音频类型转换为 mp3,然后再次尝试保存它。但是在转换类型并使用pydub导出后,它返回以下错误
AttributeError: 'file' object has no attribute '_committed'
Run Code Online (Sandbox Code Playgroud)
我的代码是这样的
def get_from_function(AudioSegment, format):
form = "from_{0}".format(format)
print form
if hasattr(AudioSegment, form):
return getattr(AudioSegment, form)
return None
audio = request.FILES.get('audio', None)
if audio:
name_list = audio.name.rsplit(".")
voice_format =name_list[1]
from_format = get_from_function(AudioSegment, voice_format)
if from_format and callable(from_format):
sound = from_format(audio)
audio = sound.export("media/{0}".format(name_list[0]), mp3")
Run Code Online (Sandbox Code Playgroud)
当我打印audio
它打印
<open file 'media/barsandtone', mode 'wb+' at 0x7f771e5e2f60>
Run Code Online (Sandbox Code Playgroud)
当我打印它打印的文件类型时
<type 'file'>
Run Code Online (Sandbox Code Playgroud)
但是当我将音频字段分配给 django 模型时
Mymodel.objects.create(audio=audio)
Run Code Online (Sandbox Code Playgroud)
它给出了错误
AttributeError at /create/
'file' object has no attribute '_committed'
Run Code Online (Sandbox Code Playgroud)
将导出的文件保存到 django 模型的正确方法是什么
小智 6
我遇到了同样的错误,现在已解决,我建议您以读取模式打开该文件,然后保存它。这是我的代码:
from django.core.files import File as DjangoFile
file_obj1 = DjangoFile(open(file_name, mode='rb'), name=file_name)
File.objects.create(title=file_name, file=file_obj1, content_object=task_obj, author=task_obj.client)
Run Code Online (Sandbox Code Playgroud)
djangoContentFile
通常需要通过一个数据流来执行此操作,并且它不像您通常将参数传递给模型的方式工作。执行此操作的正确方法如下
from django.core.files.base import ContentFile
[...]
mymodel = Mymodel()
mymodel.audio.save(audio.name, ContentFile(audio.read()))
Run Code Online (Sandbox Code Playgroud)
不要忘记将流传递给 ContentFile。如果您通过它,Django 不会引发任何错误,ContentFile(audio)
但在这种情况下,您将不会保存文件内容..
归档时间: |
|
查看次数: |
7907 次 |
最近记录: |