2011-03-30 3 views
0

양식을 사용하지 않고 Django ImageField에 이미지 파일을 등록하고 파일을 복사하지 않으려면 어떻게해야하나요?Django의 ORM을 사용하여 이미지를 등록하는 방법

나는 이미지 /에있는 수천 개의 JPG를이 있고, 나는 비슷한 이미지의 모델을 등록 할 :

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

그러나 내가 장고에 "로드"이미지를 찾을 수있는 모든 문서를 프로젝트는 양식을 통해 그렇게하고 있다고 가정합니다.이 양식은 이미지가 MEDIA_ROOT에 복사됨을 의미합니다. 저는 양식을 사용하지 않고 이미 수천 개의 JPG를 다시 복사하고 싶지 않습니다. 왜냐하면 그들은 이미 있어야 할 곳이기 때문입니다. 나는 현재 갖고있는 모든 이미지의 파일 이름을 저장할 이미지 레코드를 만들고 싶습니다. 각 이미지 위에 반복적 인 간단한 파이썬 스크립트를 작성했지만 Image 레코드를 올바르게 작성하는 방법을 찾을 수 없습니다.

또한 중복 된 레코드를 방지하기 위해 이미지 내용의 해시를 저장하려고합니다. 예 :

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

기본 model.Model.save() 메소드를 덮어 쓰시겠습니까?

답변

1

디렉토리의 이미지를 반복하는 스크립트가 있다면 거의 해결책입니다. 장고는 당신이 당신의 루프에서 할 필요가 그래서 기본적 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) 

파일을 이동하거나 양식을 사용해야하는 경우 존재하는 경우 해시로 이미지를 무해하게 반환하거나 새 레코드를 만들 것입니다.

희망 하시겠습니까?

+0

고마워, 그건 꽤 편리합니다. 유일한 단점은 내가 해싱을 투명하게 만들고 싶기 때문에 명시 적으로 모델 외부에서 생성 할 필요가 없다는 것입니다. 그러나 나는 이것이 어떻게 달리 사물을 단순화 할 수 있는지를 안다. – Cerin

+0

방금 ​​Django가 이미지 경로를 자동 수정하여 고유 한 것으로 보이므로 내 경우에는 잘못된 경로가 저장됩니다. 예 : 이미지 = 'myimage.jpg'를 저장하려고하면 실제로 'myimage_1.jpg'가 저장됩니다. 이것을 사용 중지하는 방법을 알고 있습니까? 나는 FileField 속성에 대한 코드를 파고 있었지만, 이것이 어디에서 끝나는 지 찾을 수는 없다. – Cerin

+0

흠. 자동 이름 바꾸기를 사용 중지하는 방법을 모르겠습니다. get_or_create를 사용하고 해시 *를 확인하면 중복 파일이 저장되지 않아야합니다. 그렇지 않은 경우 실제 코드가 예상대로 작동하지 않는 이유를 확인해야합니다. – Brandon

1

코드를 통해 파고, 함께 내가 찾은 몇 조각을 조립할 후 다음 날 위해 작동하는 것 같다 :

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() 
관련 문제