2010-11-18 3 views
0

mongoengine FileField에 대한 http://mongoengine.org/docs/v0.4/guide/gridfs.html 설명서 다음'FileField'객체에 'put'속성이없는 이유는 무엇입니까?

내 모델에서

files = ListField(FileField()) 

 # Create an entry 
    photo = FileField() 
    f = open('/home/foo/marmot.jpg', 'r') 
    photo.put(f, content_type='image/jpeg') 
    entry.files = [photo,] 

그러나 다음과 같은 오류가 발생합니다.

Traceback (most recent call last): 
    File "/home/bar/tests.py", line 76, in test_MongoDGACLogook_creation 
    photo.put(f, content_type='image/jpeg') 
AttributeError: 'FileField' object has no attribute 'put' 

뭔가 분명하지 않습니까?

고맙습니다

답변

2
f = mongoengine.fields.GridFSProxy() 
    to_read = open('/home/.../marmot.jpg', 'r') 
    f.put(to_read, filename=os.path.basename(to_read.name)) 
    to_read.close() 
+0

어떻게이 대답은 FileFields를 ListField에 넣는가 ?? – MFB

2

이 전혀 IMO 명확하지 않다,하지만 당신은 Mongoengine 코드를 보면 있습니다 (put 방법은 FileField의 설명을 통해 액세스하는 GridFSProxy 클래스에 정의 된 것을 볼 수 있습니다 __get____set__ 방법).

코드의 내용과 문서의 예를 보면 FileField에 액세스하거나 사용하는 유일한 방법은 설명자 .... so, collection.file_field입니다.

이 모든 것을 감안할 때 현재 존재하는 Mongoengine API를 사용하여 파일 필드 목록을 가질 수 있다고 생각하지 않습니다.

0

당신이 배수 파일을 업로드하고 저장하려고하는 경우의 ListField (FileField와())

<input type='file' name='myfiles' multiple=""> 

files = [] 
for f in request.FILES.getlist('myfiles'): 
    mf = mongoengine.fields.GridFSProxy() 
    mf.put(f, filename=f.name) 
    files.append(mf) 
entry.files = files 
entry.save() 
0

나는 정확히 같은 문제가 있었다. this post에 GitHub의에 @KoppeKTop에 의해 제안, 나는 마침내 이와 같은 EmbeddedDocument를 사용하여 내 모델 (Pet을) 확장 :

class OneImage(mongoengine.EmbeddedDocument): 
    element = ImageField() 

class Pet(mongoengine.Document): 
    photos = EmbeddedDocumentListField(OneImage) 
    # ...more fields... # 

은 그때 사용하여 새 이미지

i = OneImage() 
    i.element.put(form.photo.data.stream) 
    entry.photos.append(i) 
    entry.save() 

을 추가 할 수 있습니다 이것은 항상하지 않을 수 있습니다 가장 좋은 선택이지만 개인적으로 나는 프록시로 작업하지 않고 평상시처럼 모델로 작업 할 수 있기 때문에 개인적으로 선호합니다. 필요한 경우 앞으로 다른 사진 메타 데이터를 저장할 수도 있습니다.