Наполнение модели образцами изображений

models.py

class Phrase(models.Model):
    image = models.ImageField(blank=True,
                              default="",
                              null=False,                              
 upload_to=UploadTo(folder=UPLOAD_TO.VOCABULARY_IMG_FOLDER).save_path)

Сценарий

sample_img_dir = os.path.join(settings.BASE_DIR, 'doc', 'samples', 'img')
sample_images = os.listdir(sample_img_dir)
img = random.choice(sample_images)
f = open(os.path.join(sample_img_dir, img))
sample_img = File(f)

obj = Phrase(
        image=sample_img
    )
obj.save()

У меня есть модель с полем ImageField. Я хочу заполнить его данными из выборки. Речь не идет о тестировании. Я просто хочу заполнить базу данных в целях разработки. Я сохранил несколько 50 jpg файлов и решил добавить их программно.

У меня ничего не получилось. Этот код взрывается с исключением:

  File "/usr/lib/python3.8/codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
python-BaseException

Process finished with exit code 130 (interrupted by signal 2: SIGINT)

Вы можете мне помочь?

f = open(os.path.join(sample_img_dir, img), "rb")

должно сработать. Если нет, вы можете попробовать добавить стандарт кодировки, например

f = open(os.path.join(sample_img_dir, img), "rb", encoding="utf-8")

Но я не уверен, что это вообще работает с байтами, возможно, это работает только для "r".

Вы должны дать файлу также имя:

sample_img = File(f, img)

Если у вас уже есть созданная модель, вы можете slo сохранить файл после этого с помощью:

phrase = Phrase.objects.get(pk=1)
phrase.upload_to.save(img, content=sample_img))

небольшая правка:

вы можете быстрее создать новую запись с помощью следующей команды:

phrase = Phrase.objects.create(
    image=sample_img
)
Вернуться на верх