Если у вас есть поток байтов, который вы хотите сохранить в 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"
Это немного придирчиво, но оно выполняет свою работу. Будем надеяться, что API будет очищен немного больше в 1.3 / 4.
Edit:
См. ответ Джейсона для более простого способа сделать это, хотя вы все равно захотите узнать имя файла изображения.