Как записать в Django FileField из временного файла?

Я обрабатываю изображение в приложении Django. Я использовал rasterio для обработки геопространственного изображения. Я хочу сохранить вывод непосредственно в поле FileField в модели. Я использовал tempfile для записи вывода из rasterio и использовал метод Model.FileField.save для надежды записать его со ссылкой на мой экземпляр Модели.

У меня есть простая модель:

class MaskedLayer(models.Model):
    name = models.CharField(max_length=250, blank=True)
    file = models.FileField(
        upload_to='masked',
        null=True,
        max_length=500)

В моих задачах, однако, это пример:

from celery import shared_task
import rasterio
import tempfile

from app.models import MaskedLayer


@shared_task
def process_image():

    mask_layer_name = 'processed_image.tif'
    masked_layer = MaskedLayer.objects.create()

    with rasterio.open('example.tif') as dataset: # only example of reading/processing of image
        out_image = dataset.read()

    with tempfile.NamedTemporaryFile() as tmpfile:
        tmpfile.write(out_image)

        with rasterio.open(tmpfile.name) as dataset:
            masked_layer.file.save(mask_layer_name, File(dataset))


    pass

Я получаю такой ответ. Я не уверен в ошибке. Не стесняйтесь использовать примерный файл .

Я далеко не знаком с rasterio и celery, но позвольте мне показать вам мою рабочую реализацию в качестве руководства:

import io
from django.core.files.images import ImageFile

def _upload_location(instance, filename):
    return f'/some/path/{filename}'

class MyModel(models.Model):
    model_image_field = models.ImageField(null=True, blank=True, upload_to=_upload_location, editable=False)

    def save_structure_img(self):
        tmp_img = io.BytesIO()  # create buffer
        structure_img = self.create_structure_img() # create img 
        structure_img.save(tmp_img, 'PNG')  # utilize save method of your image to save it to the buffer
        name = "your_wanted_filename"  # create a name
        self.model_image_field.save(f'{name}.png', ImageFile(tmp_img)) # save buffer to model_image field

Я знаю, я отредактировал создание structure_img, но это не должно иметь значения, потому что это специфично для моего проекта.

Позвольте мне попытаться перевести это на ваш случай:

import io
from django.core.files.images import ImageFile

@shared_task
def process_image():

    mask_layer_name = 'processed_image.tif'
    masked_layer = MaskedLayer.objects.create()

    with rasterio.open('example.tif') as dataset: # only example of reading/processing of image
        out_image = dataset.read()
    
    tmp_img = io.BytesIO() # create buffer
    out_image.save(tmp_img, 'PNG')
    # i hope this is the right place where out_image has a `.save` method.
    name = "your_wanted_filename"
    
    masked_layer.field.save(f'{name}.png', ImageFile(tmp_img))
    pass

Также я признаю, что не имею ни малейшего представления о том, что пытается сказать мне предложенная вами ошибка. Но мне кажется, что база данных жалуется на то, что вы пытаетесь вставить. Если вы ищете ответ, как исправить именно эту ошибку, то мой ответ - не то, что вы ищете. Это скорее альтернативный подход к тому же решению.

Вернуться на верх