3

VARBINARYDjangov1.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:カスタムモデルフィールドの記述

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

4

3 に答える 3

0

あなたが参照した同じチケットには、このフィールドの実装に向けたいくつかの指針を与えるパッチもあります。

いずれにせよ、それを CharField に格納する本当の問題は何ですか?

bin フィールドを実装する場合でも、models.CharField を拡張し、to_python メソッドで 16 進数にキャストできます。

また、同じ質問が以前にも回答されています: Django モデル フィールドにバイナリ ハッシュ値を格納する

于 2009-10-19T13:51:17.977 に答える
0

MySQL は、VARBINARY フィールドの 16 進表現を格納することも、INSERT ステートメントでそれを要求することもありません。VARCHAR との唯一の違いは、MySQL がバイナリ照合を使用することです。任意の 8 ビット文字列をパラメーターとして渡すことができます。

于 2009-10-19T17:39:43.767 に答える