2

base64Django REST Framework (DRF) で、エンコードされたバイナリ データの逆シリアル化をサポートするにはどうすればよいですか?

私はモデルを持っています:

class MyModel(Model):
   data = models.FileField(...)

マルチパートフォームデータや「ファイルアップロード」ではなく、このデータをbase64エンコードとして送信できるようにしたいと考えています。を見ると、ファイルParsersのみが解析されているようです。FileUploadParserMultiPartParser

このデータを JSON のような形式で送信できるようにしたいと考えています (つまり、バイナリ データを ではなく で送信しdataますfiles

{
 'data':'...'
}
4

3 に答える 3

4

新しいを作成して解決しましたParser

def get_B64_JSON_Parser(fields):
    class Impl(parsers.JSONParser):
        media_type = 'application/json+b64'

        def parse(self, *args, **kwargs):
            ret = super(Impl, self).parse(*args, **kwargs)
            for field in fields:
                ret[field] = SimpleUploadedFile(name=field, content=ret[field].decode('base64'))
            return ret
    return Impl

次に、次のように使用しますView

class TestModelViewSet(viewsets.ModelViewSet):
    parser_classes = [get_B64_JSON_Parser(('data_file',)),]
于 2014-11-06T21:02:38.077 に答える
0

おそらく、シリアライザ レベルで何か巧妙にできることがありますが、最初に頭に浮かぶのは、ビューでそれを行うことです。

ステップ 1 : ファイルを書き込みます。何かのようなもの:

fh = open("/path/to/media/folder/fileToSave.ext", "wb")
fh.write(fileData.decode('base64'))
fh.close()

ステップ 2 : モデルにファイルを設定します。何かのようなもの:

instance = self.get_object()
instance.file_field.name = 'folder/fileToSave.ext' # `file_field` was `data` in your example
instance.save()

ステップ 1 の絶対パスと、ステップ 2 のメディア フォルダへの相対パスに注意してください。

これは少なくともあなたを動かすはずです。

理想的には、これを serialiser フィールドとして指定し、検証とモデル インスタンスへの自動割り当てを無料で取得します。しかし、それは一見複雑に思えます。

于 2014-11-06T17:48:54.320 に答える