2010-11-18 22 views
0

Aşağıdaki http://mongoengine.org/docs/v0.4/guide/gridfs.html dökümantasyonları hakkında daha fazla bilgi için aşağıdakileri yaptık:Neden 'FileField' nesnesinin 'put' özelliği bulunmuyor?

Modelimde

files = ListField(FileField()) 

Test kodumda

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

Dokümanları izlemeye çalışıyorum ancak bir hata mesajı alıyorum:

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' 

Bariz bir şey mi eksik?

Teşekkürler

cevap

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

Bu cevap FileFields'ı bir ListField'a nasıl yerleştiriyor? – MFB

2

Bu hiç IMO açık değildir, ancak Mongoengine koduna baktığımızda eğer (put yöntem FileField bir tanımlayıcısı aracılığıyla erişilir GridFSProxy sınıfında, içinde tanımlandığını göreceksiniz __get__ ve __set__ yöntemleri).

Kodlara ve belgelerindeki örneklere bakıldığında, FileField erişiminin veya kullanılmasının tek yolu açıklayıcıdır .... yani, collection.file_field.

Tüm bunlar göz önünde bulundurulduğunda, şu anda mevcut olan Mongoengine API'sini kullanarak dosya alanlarının bir listesini bulundurmanın mümkün olduğunu düşünmüyorum.

0

Eğer katları dosyaları göndererek ve kaydedin çalışıyorsanız bir 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

Ben tam olarak aynı problem vardı. this post yılında GitHub'dan @KoppeKTop önerdiği gibi, sonunda böyle bir EmbeddedDocument kullanarak modeli (Pet) genişletilmiş:

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

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

Sonra kullanarak yeni bir resim

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

ekleyebilir Bu her zaman olmayabilir en iyi seçenek olmakla birlikte, kişisel olarak tercih ederim çünkü proxy'lerle çalışmaya gerek kalmadan her zamanki gibi modellerle çalışabilirim. Ve eğer gerekirse, diğer fotoğraf meta verilerini de kaydedebilirim.

İlgili konular