Allow File-like objects to be stored.

No longer demands FileField be an actual instance of file, but instead
checks whether object has a 'read' attribute. Fixes read() on
GridFSProxy to return an empty string on read failure, or None if file
does not exist.
This commit is contained in:
Jona Andersen
2012-04-22 13:49:18 +02:00
parent 5f4b70f3a9
commit c474ca0f13
2 changed files with 24 additions and 4 deletions

View File

@@ -875,10 +875,14 @@ class GridFSProxy(object):
self.newfile.writelines(lines)
def read(self, size=-1):
try:
return self.get().read(size)
except:
gridout = self.get()
if gridout is None:
return None
else:
try:
return gridout.read(size)
except:
return ""
def delete(self):
# Delete file from GridFS, FileField still remains
@@ -935,7 +939,7 @@ class FileField(BaseField):
def __set__(self, instance, value):
key = self.name
if isinstance(value, file) or isinstance(value, str):
if (hasattr(value, 'read') and not isinstance(value, GridFSProxy)) or isinstance(value, str):
# using "FileField() = file/string" notation
grid_file = instance._data.get(self.name)
# If a file already exists, delete it