2009-10-19 14 views
3

J'essaie de modéliser un champ MySQL VARBINARY dans Django v1.1.1. Le champ binaire stocke une représentation hexadécimale de données (on utiliserait INSERT INTO test(bin_val) VALUES X'4D7953514C')Django: Comment modéliser un champ MySQL VARBINARY HEX?

lecture de la documentation Django [1] Je suis venu avec cette sollution:

class MyTest(models.Model): 
    bin_val = BinValField() 

class BinValField(models.Field): 
    __metaclass__ = models.SubfieldBase 

    def to_python(self, value): 
     """ DB -> Python """ 
     return ''.join('%X%X' % ((ord(byte)>>4) & 0xF, ord(byte) & 0xF) for byte in value) 

    def get_db_prep_value(self, value): 
     """ Python -> DB """ 
     return a2b_hex(value).decode('latin1') 

Toutefois, cela ne fonctionne pas correctement parce que:

  • Django fait une transformation Unicode des données binaires de MySQL
  • Lors de l'enregistrement d'un nouvel objet MyTest, le get_db_prep_value() est appelé deux fois (je pense que cela est un bug dans Django?)

La question est de savoir comment modéliser un tel champ?

PS: associés à ce problème est ce ticket [2] qui est encore ouvert au bout de 3 ans :(

[1] Django: écriture des champs de modèle personnalisés

[2] http://code.djangoproject.com/ticket/2417

+0

Quelle est la question réelle ici? – Mez

+0

La question est de savoir comment modéliser un tel champ correctement dans Django? –

Répondre

1

Le problème était la manière dont Django créait les tables de base de données et était également lié au classement de la base de données.

La façon dont je l'ai résolu était la suivante:

  • changé la table charset utf8 et la collation utf8_bin
  • a changé le champ binaire VARCHAR-VARBINARY dans la table MySQL
  • utilisé dans la to_python la méthode return hexlify(value)
0

Le même billet vous a appelé aussi a patch qui devrait donner quelques indications pour la mise en œuvre ce domaine.

dans tous les cas, ce qui est votre problème réel pour la stocker dans un CharField?

Même si vous deviez implémenter un champ bin, vous pouvez simplement étendre le fichier models.CharField et le convertir en hexadécimal dans la méthode to_python.

également la même question a également été répondu plus tôt: Storing a binary hash value in a Django model field

0

MySQL ne stocker représentation hexadécimale pour les champs VARBINARY ne l'exigent dans l'instruction INSERT. La seule différence avec VARCHAR est que MySQL utilise le classement binaire pour cela. Vous pouvez passer n'importe quelle chaîne de 8 bits comme paramètre pour cela.

Questions connexes