AttributeError:'file'对象没有'_committed'属性

时间:2016-04-13 21:45:27

标签: python django filefield django-file-upload

我的模型中有一个DjangoFileField。我试图将音频类型从FielField转换为mp3,然后再次尝试保存它。但转换类型并使用pydub导出后,它返回以下错误

AttributeError: 'file' object has no attribute '_committed'

我的代码就像这样

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")

当我打印audio打印

<open file 'media/barsandtone', mode 'wb+' at 0x7f771e5e2f60>

当我打印它打印的文件类型时

<type 'file'>

但是当我将音频字段分配给django模型时,如

Mymodel.objects.create(audio=audio)

它给出了错误

AttributeError at /create/
'file' object has no attribute '_committed'

将导出的文件保存到django模型的正确方法是什么

2 个答案:

答案 0 :(得分:3)

django通常需要ContentFile这样做才能将数据流传递给它,并且它通常不会像通常将参数传递给模型那样工作。正确的方法是以下

from django.core.files.base import ContentFile
[...]
mymodel = Mymodel()
mymodel.audio.save(audio.name, ContentFile(audio.read()))

不要忘记将流传递给ContentFile。如果你传递ContentFile(audio),Django不会引发任何错误,但在这种情况下你不会保存文件内容..

答案 1 :(得分:1)

我遇到了现在解决的错误,我建议您以读取模式打开该文件,然后保存。这是我的代码:

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)