Боюсь, короткий ответ заключается в том, что вы не можете сделать это с помощью классов FileField или ImageField; они просто хранят путь к файлу и не имеют реального представления о реальных данных файла. Длинный ответ, однако, заключается в том, что все возможно, если вы используете API Django для написания собственных пользовательских полей модели .
Как минимум, вы захотите реализовать метод value_to_string
для преобразования данных для сериализации (пример приведен в документации django по ссылке выше). Обратите внимание, что примеры в URL-ссылке выше также включают упоминание о подклассах FileField и ImageField, что полезно для вашей ситуации!
Вам также придется решить, следует ли хранить данные в базе данных или в файловой системе. Если первое, вам придется реализовать свой пользовательский класс как поле Blob, включая настройку для каждой БД, которую вы хотите поддерживать; вам также потребуется обеспечить некоторую поддержку того, как данные должны быть возвращены пользователю из базы данных, когда HTML-запрос запрашивает URL-адрес .gif / .jpg / .png / .whwh. Если последний вариант, который является наиболее разумным способом ИМХО, вам придется реализовать методы для сериализации, десериализации двоичных данных в файловой системе. В любом случае, если вы реализуете их как подклассы FileField и ImageField, вы все равно сможете использовать инструменты администратора и другие модули, которые ожидают таких возможностей django.
Если и только если вы решите использовать более сложный подход BLOB-объектов, вот фрагмент кода из старого проекта (еще когда я изучал Django), который обрабатывает BLOB-объекты для MySQL и PostgreSQL; вы, вероятно, сможете найти ряд улучшений, поскольку я не затрагивал их с тех пор :-) Однако он не обрабатывает сериализацию, поэтому вам придется добавить это, используя метод выше.
from django.db import models
from django.conf import settings
class BlobValueWrapper(object):
"""Wrap the blob value so that we can override the unicode method.
After the query succeeds, Django attempts to record the last query
executed, and at that point it attempts to force the query string
to unicode. This does not work for binary data and generates an
uncaught exception.
"""
def __init__(self, val):
self.val = val
def __str__(self):
return 'blobdata'
def __unicode__(self):
return u'blobdata'
class BlobField(models.Field):
"""A field for persisting binary data in databases that we support."""
__metaclass__ = models.SubfieldBase
def db_type(self):
if settings.DATABASE_ENGINE == 'mysql':
return 'LONGBLOB'
elif settings.DATABASE_ENGINE == 'postgresql_psycopg2':
return 'bytea'
else:
raise NotImplementedError
def to_python(self, value):
if settings.DATABASE_ENGINE == 'postgresql_psycopg2':
if value is None:
return value
return str(value)
else:
return value
def get_db_prep_save(self, value):
if value is None:
return None
if settings.DATABASE_ENGINE =='postgresql_psycopg2':
return psycopg2.Binary(value)
else:
return BlobValueWrapper(value)