2010-10-12 5 views
4

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?

Répondre

13

Il n'y a pas de contrainte nécessitant get_db_prep_value retourner des caractères « imprimables », ou les ASCII ou ensembles de caractères autrement-restreintes: retour une chaîne d'octets qui attire votre fantaisie. Vous obtiendrez une chaîne dans to_python et pouvez créer une instance semblable à un fichier StringIO lisant ses données avec the_instance = StringIO.StringIO(value) (bien sûr, vous aurez besoin de import StringIO en haut de votre module).

Questions connexes