9

django モデルに保存したい 20 バイトの 16 進ハッシュがあります。テキスト フィールドを使用すると、Unicode として解釈され、文字化けして返されます。

現在、私はそれをエンコードしてデコードしていますが、それによってフィルタリングできる必要があるため、コードが本当に混乱しています。

def get_changeset(self):
    return bin(self._changeset)

def set_changeset(self, value):
    self._changeset = hex(value)

changeset = property(get_changeset, set_changeset)

フィルタリングの例を次に示します。

Change.objects.get(_changeset=hex(ctx.node()))

これは django 開発者が推奨するアプローチですが、20 バイトを格納するだけではこれほど醜いという事実を受け入れるのに本当に苦労しています。

多分私は純粋主義者すぎるかもしれませんが、理想的には書くことができるでしょう.

Change.objects.get(changeset=ctx.node())

プロパティを使用すると、次のように記述できます。

change.changeset = ctx.node()

それは私が尋ねることができるのと同じくらい良いです。

4

5 に答える 5

3

「django モデルに保存したい 20 バイトの 16 進ハッシュがあります。」

Django はこれを行います。それらは、技術的には文字列である 16 進ダイジェストを使用します。バイトではありません。

使用しないでくださいsomeHash.digest()-- 簡単に格納できないバイトが発生します。

使用someHash.hexdigest()-- 簡単に保存できる文字列を取得します。

編集-- コードはほぼ同じです。

http://docs.python.org/library/hashlib.htmlを参照してください。

于 2009-02-06T00:59:44.013 に答える
2

エスケープとエスケープ解除を行う独自のカスタムモデルマネージャーを作成することもできます。

于 2009-02-05T19:52:58.390 に答える
1

この問題がまだ関心のある場合は、Disqusdjango-bitfieldが法案に適合します。

https://github.com/disqus/django-bitfield

... GitHubのサンプルコードは、最初はモジュールの実際の機能とは少し混乱します。これは、変数名が不吉であるためです。一般的に、私は、他の誰かの間抜けな識別子をタスクに持っていきます...しかしflaggy_foo?? Srsly、Uみんな。

そのプロジェクトが気に入らず、Postgresを使用している場合は、Postgresのネイティブタイプを利用するさまざまなDjangoフィールドのコードを作成してリリースしているため、多くの優れたオプションがあります。hstoreモデルフィールドは次のとおりです。

https://github.com/jordanm/django-hstore-私はこれを使用しましたが、うまく機能します。

Postgresのtermvectorタイプを使用する全文検索の実装は次のとおりです。

https://github.com/aino/django-pgindex

この特定のプロジェクトを保証することはできませんが、Djangobyteaフィールドもあります。

https://github.com/aino/django-arrayfields

于 2012-09-19T14:22:44.573 に答える