VARBINARY
Djangov1.1.1でMySQLフィールドをモデル化しようとしています。バイナリフィールドには、データの16進表現が格納されます(つまり、を使用しますINSERT INTO test(bin_val) VALUES X'4D7953514C'
)
Djangoのドキュメントを読む[1]私はこの解決策を思いついた:
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')
ただし、これは次の理由で正しく機能しません。
- DjangoはMySQLからのバイナリデータのUnicode変換を行います
- 新しいMyTestオブジェクトを保存すると、
get_db_prep_value()
が2回呼び出されます(これはDjangoのバグだと思いますか?)
問題は、そのようなフィールドをどのようにモデル化するかです。
PS:この問題に関連しているのは、このチケット[2]で、3年経ってもまだ開かれています:(
[1] Django:カスタムモデルフィールドの記述