Как зарегистрировать изображения с помощью ORM Django - PullRequest
0 голосов
/ 30 марта 2011

Как зарегистрировать файл изображения в Django ImageField без использования формы и без копирования файлов?

У меня есть несколько тысяч JPG, расположенных в / images, и я хочу зарегистрировать их в модели изображений, аналогичной:

class Image(models.Model):
    image = models.ImageField(upload_to='images', max_length=1000)
    hash = models.CharField(max_length=1000, unique=True)

Однако все документы, которые я могу найти при «загрузке» изображений в проект Django, предполагают, что я делаю это через форму, которая также подразумевает, что изображение будет скопировано в MEDIA_ROOT. Я не использую форму, и я не хочу переписывать несколько тысяч JPG, поскольку они уже там, где они должны быть. Я просто хочу создать записи изображений, которые будут хранить имя файла всех изображений, которые у меня есть в настоящее время. Я написал простой сценарий Python для циклического перебора каждого изображения, но не могу найти, как правильно создать запись об изображении.

Я также хочу сохранить хэш содержимого изображения, чтобы избежать дублирования записей. например, * +1008 *

import hashlib
content = open(image_filename).read()
h = hashlib.sha512()
h.update(content)
imgobj.hash = h.hexdigest()
imgobj.save()

Могу ли я переопределить метод model.Model.save () по умолчанию, чтобы сделать это?

Ответы [ 2 ]

1 голос
/ 30 марта 2011

После того, как я покопался в коде и собрал несколько фрагментов, которые я нашел, мне кажется, что работает следующее:

models.py

import os, hashlib
from django.db import models

class Image(models.Model):
    image = models.ImageField(upload_to=IMAGE_UPLOAD_TO, max_length=1000)
    hash = models.CharField(max_length=1000, unique=True)

    def save(self, *args, **kwargs):
        # Update image hash to ensure uniqueness.
        h = hashlib.sha512()
        h.update(self.image.read())
        self.hash = h.hexdigest()
        return models.Model.save(self, *args, **kwargs)

import_images.py

import os
from django.conf import settings
from django.core.files import File
from myapp import models

fn = os.path.join(settings.MEDIA_ROOT, 'images', 'mytestimage.jpg')
img = models.Image()
img.image.save(fn, File(open(fn, 'r')))
img.save()
1 голос
/ 30 марта 2011

Если у вас есть скрипт для циклического перемещения по изображениям в вашем каталоге, вы почти готовы к решению.Django будет хранить только путь к изображению в вашем поле Image.image, поэтому в основном все, что вам нужно сделать в цикле:

#pseudo-code
for image_file in image_files:
    image, created = Image.objects.get_or_create(hash=the_hash, \
        defaults={'image' : 'path/to/image', 'hash' : the_hash)

Это довольно простой способ создать только уникальные записи в вашем цикле.базы данных без необходимости перемещать файлы или использовать форму.Вы либо собираетесь безопасно вернуть изображение по хешу, если оно существует, либо создадите новую запись.

Надеюсь, это поможет!

...