2011-02-06 5 views
22

DjangoのORM、PostgreSQLバックエンドを使用してバイナリデータの "blob"をどのように保存しますか?はい、私はDjangoがそのようなことに悩まされていることを知っています。はい、彼らはあなたがImageFieldやFileFieldを使いたいと思っていますが、私のアプリケーションでは実用的ではありません。Django Blobモデルフィールド

私はTextFieldを使用してハッキングしようとしましたが、バイナリデータがモデルのエンコードタイプ(デフォルトではUnicode)に厳密には一致しない場合、時折エラーが発生します。例えば

psycopg2.DataError: invalid byte sequence for encoding "UTF8": 0xe22665 

答えて

24

このスニペット任意良い:

http://djangosnippets.org/snippets/1597/

これはおそらく テキストフィールドにバイナリデータを格納するための最も簡単な解決策です。

import base64 

from django.db import models 

class Foo(models.Model): 

    _data = models.TextField(
      db_column='data', 
      blank=True) 

    def set_data(self, data): 
     self._data = base64.encodestring(data) 

    def get_data(self): 
     return base64.decodestring(self._data) 

    data = property(get_data, set_data) 

は役立つかもしれないが、他のスニペットのカップルあります。私は「mysqlの」バックエンドのために、この単純なフィールドを使用している

+0

ありがとうございます。私は似たようなものを使っていましたが、そのスニペットははるかに単純です。 – Cerin

+3

すばらしいスニペットをありがとう。これがフィルタリングをサポートするかどうか知っていますか?すなわち 'Foo.objects.filter(data = my_file)'は 'my_file'を' get_data'で処理しますか? – Patrick

10

、あなたはDjango Storages' Database Storage:をチェックアウトし、また、他のバックエンド

class BlobField(models.Field): 
    description = "Blob" 
    def db_type(self, connection): 
     return 'blob' 
+0

このカスタムフィールドは 'syncdb'を使用するとエラーを発生させます –

+0

@MichaelWaterfallどのようなエラーが発生しますか? –

+0

詳細が不明なことに申し訳ありませんが、私はその時点で調査中でした。 Django 1.2では[db_type](https://docs.djangoproject.com/en/dev/howto/custom-model-fields/#django.db.models.Field.db_type)メソッドは 'connection'引数をとります。これが 'syncdb 'の間の例外の原因でした。私はコードを修正しました。 –

0

のためにそれを変更することができます。

私はまだそれを使用していませんが、それは素晴らしいと私は私の答えを投稿するとすぐにそれを使用し始めるつもりです。

19

Django> = 1.6を使用している場合は、BinaryField

関連する問題