J'ai un requeriment pour stocker des images dans la base de données en utilisant django, et que j'ai créé un champ personnalisé:Comment formater correctement un objet StringIO (python et django) à insérer dans une base de données?
from django.db import models
class BlobField(models.Field):
__metaclass__ = models.SubfieldBase
def db_type(self, connection):
#TODO handle other db engines
backend = connection.settings_dict['ENGINE']
if backend == 'django.db.backends.postgresql':
return 'bytea'
elif backend == 'django.db.backends.sqlite3':
return 'blob'
else:
raise Exception('unsuported db')
def to_python(self, value):
#TODO
return value
def get_db_prep_value(self, value, connection, prepared=False):
#TODO
return value
Je l'ai déjà mis en place une mesure storage system pour gérer le stockage/récupération des images à l'aide d'un modèle personnalisé (qui contient le BlobField ci-dessus). Le paramètre 'value' de la méthode 'get_db_prep_value' est un objet 'StringIO' qui contient les données binaires de l'image. Le problème est que je ne sais pas quoi retourner dans la méthode 'get_db_prep_value' puisque l'objet 'StringIO' contiendra sûrement des caractères non-imprimables.
J'ai quelques questions sur le problème:
- Que dois-je retourner dans la méthode 'get_db_prep_value'?
- Si la valeur attendue est une chaîne ASCII, puis-je représenter le blob (échappement hexadécimal) dans une base de données de manière indépendante?
- Sinon, y a-t-il des bibliothèques intégrées qui traitent ce type de conversion pour moi?
- Que puis-je espérer recevoir en entrée pour la méthode 'to_python', et comment puis-je le convertir en objet StringIO?