2016-03-11 19 views
5

フロート番号の問題に直面しています3.333333333と私はそれを作りたい3.33です。このタイプの価値が来るところからすべてSerializerクラスを変更したくありません。数千のシリアライザがあり、3.333333333のような値を持つ複数のフィールドがあります。Django Rest Framework Jsonデータサルパッチ

猿のパッチを当てるタイプのソリューションを見つけるのを手伝ってください。浮動小数点値だけを変換する1つのクラスまたは関数を記述します。

+1

3.333333を返すと間違って何ですか?あなたのapiの任意の消費者は3.33としてそれを表示することができます。クライアントが書式設定を処理できるようにします。 – Ali

+0

Androidでは、float、int、longなどのデータ型を指定する必要があります。 最初のデータは** 4.56 **でしたが、現在は** 3.3333333 **となっています。 ですので、すべてのfloatデータ型をlongに変更することは非常に困難です。なぜ私は**バックエンド**クライアントエンドでは解決策が必要です。 –

+1

私はvinayが正しいと思います、私も同じ問題に直面しました。クライアント側からそれらを変換する(特にアンドロイドは良い考えではありません)@vinaykumar、あなたもあなたの試行を書き留めておけば、人々はあなたの質問に答えてくれるでしょう。私はJSONEncodeクラスから呼び出されているjson.dumpsをmonkeypatchする必要があると思います。 – Pawan

答えて

0

私はいくつかのコードを動作させました。 は私がrenderers.py /以下のファイル

settings.py

REST_FRAMEWORK = { 
'DEFAULT_RENDERER_CLASSES': (

    'utils.renderers.PalJSONRenderer', 

    'rest_framework.renderers.BrowsableAPIRenderer', 
)} 

utilsの中で変更を行っ

 from rest_framework.renderers import JSONRenderer 
     from rest_framework.utils.encoders import JSONEncoder 

     from json.encoder import encode_basestring_ascii, encode_basestring, INFINITY, _make_iterencode 


     class CustomJSONEncoder(JSONEncoder): 

      def iterencode(self, o, _one_shot=False): 
       """Encode the given object and yield each string 
       representation as available. 

       For example:: 

        for chunk in JSONEncoder().iterencode(bigobject): 
         mysocket.write(chunk) 

       """ 
       # Hack to enforce 
       c_make_encoder = None 
       if self.check_circular: 
        markers = {} 
       else: 
        markers = None 
       if self.ensure_ascii: 
        _encoder = encode_basestring_ascii 
       else: 
        _encoder = encode_basestring 

       def floatstr(o, allow_nan=self.allow_nan, _repr=lambda o: format(o, '.2f'), _inf=INFINITY, _neginf=-INFINITY): 
        # Check for specials. Note that this type of test is processor 
        # and/or platform-specific, so do tests which don't depend on the 
        # internals. 

        if o != o: 
         text = 'NaN' 
        elif o == _inf: 
         text = 'Infinity' 
        elif o == _neginf: 
         text = '-Infinity' 
        else: 
         return _repr(o) 

        if not allow_nan: 
         raise ValueError(
          "Out of range float values are not JSON compliant: " + 
          repr(o)) 

        return text 

       if (_one_shot and c_make_encoder is not None and self.indent is None): 
        _iterencode = c_make_encoder(
         markers, self.default, _encoder, self.indent, 
         self.key_separator, self.item_separator, self.sort_keys, 
         self.skipkeys, self.allow_nan) 
       else: 
        _iterencode = _make_iterencode(
         markers, self.default, _encoder, self.indent, floatstr, 
         self.key_separator, self.item_separator, self.sort_keys, 
         self.skipkeys, _one_shot) 
       return _iterencode(o, 0) 


     class PalJSONRenderer(JSONRenderer): 
      encoder_class = CustomJSONEncoder 
関連する問題