class MyModel(models.Model) image = models.FileField(upload_to="blagh blagh...") #more spam...
У меня есть файл в памяти, и я хочу сохранить ее через Django FileField, сохраняют метод, как это:
photo.image.save(name, buffer) # second arg should be django File
Я попытался использовать StringIO, но он не расширяет django.core.files. Файл и таким образом не реализует блоки метода (). Я перенес его в объект Файла как этот:
buffile = File(buffer, name) # first argument should be a file photo.image.save(name, buffile)
Но методы Файла используют размер и поля имени предоставленного файла. StringIO не определяет их. Я нашел это, но ссылка является битой
Если у вас есть поток байтов, который вы хотите сохранить в FileField / ImageField, вот код, который может помочь:
>>> from django.core.files.uploadedfile import InMemoryUploadedFile
>>> from cStringIO import StringIO
>>> buf = StringIO(data) # `data` is your stream of bytes
>>> buf.seek(0, 2) # Seek to the end of the stream, so we can get its length with `buf.tell()`
>>> file = InMemoryUploadedFile(buf, "image", "some_filename.png", None, buf.tell(), None)
>>> photo.image.save(file.name, file) # `photo` is an instance of `MyModel`
>>> photo.image
<ImageFieldFile: ...>
Некоторые примечания:
InMemoryUploadedFile
- это имя поля в вашей модели, поэтому "image" Это немного привередливо, но выполняет свою работу. Будем надеяться, что в версии 1.3 / 4 API будет немного доработан.
Изменить:
См. ответ Джейсона , где описан более простой способ сделать это, хотя вам все равно нужно знать имя файла изображения.
Вы можете использовать ContentFile вместо File
from django.core.files.base import ContentFile
photo.image.save(name, ContentFile(buffer))