2016-03-11 10 views
5

Ich habe ein Problem mit Float-Nummer wie 3.333333333 und ich möchte es 3.33. Ich möchte nicht alle Serializer Klassen ändern, woher dieser Werttyp kommt. Es gibt tausend Serialisierer und sie haben mehrere Felder, die Werte wie 3.333333333 haben.Django Rest Framework JSON Daten Affe Patching

Könnten Sie mir bitte helfen, eine Affepatch-Lösung zu finden, so dass ich eine Klasse oder Funktion schreibe, um nur Gleitkommawerte zu konvertieren.

+1

, was falsch ist mit 3,333333 Rückkehr? Jeder Verbraucher Ihrer API kann es als 3.33 anzeigen. Lassen Sie den Client die Formatierung behandeln. – Ali

+0

In Android müssen sie den Datentyp wie float, int oder long angeben. nehme an, dass die Daten anfänglich ** 4,56 ** waren, jetzt aber ** 3,3333333 **. so ist es sehr schwierig, den Float-Datentyp jetzt zu lang zu ändern. Deshalb brauche ich eine Lösung bei ** Back-End ** nicht Client-Ende. –

+1

Ich nehme an, Vinay hat Recht, ich habe auch das gleiche Problem gesehen. Konvertieren sie von Client-Seite (vor allem Android ist keine gute Idee) @vinaykumar, werden die Leute gerne Ihre Frage beantworten, wenn Sie auch Ihre Versuche (was haben Sie versucht) mit Frage aufzuschreiben. Ich denke, Sie müssen jke.dumps monkeypatch, die von JSONEncode-Klasse aufgerufen wird. – Pawan

Antwort

0

Ich habe einige Code funktioniert. ich Änderungen in folgenden Dateien

settings.py

REST_FRAMEWORK = { 
'DEFAULT_RENDERER_CLASSES': (

    'utils.renderers.PalJSONRenderer', 

    'rest_framework.renderers.BrowsableAPIRenderer', 
)} 

utils/renderers.py

 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 
Verwandte Themen