2012-11-06 13 views
8

Mam zestaw kwerend, który zawiera obiekty dziesiętne. Chcę przekazać te dane do json dump wzdłuż linii:Django przekazywanie obiektów dziesiętnych do json

ql = Product.objects.values_list('length', 'width').get(id=product_id) 
data = simplejson.dumps(ql) 

TypeError: Decimal('62.20') is not JSON serializable 

Jak przekazać te wartości do json. Oczywiście mógłbym rzucić wartości na string - ale domyślam się, że to nie jest dobre rozwiązanie.

Każda pomoc bardzo ceniona.

Odpowiedz

20

Django już zawiera koder niż można sobie z miejscami po przecinku, a także datetimes: django.core.serializers.json.DjangoJSONEncoder. Po prostu podaj to jako parametr cls:

data = simplejson.dumps(ql, cls=DjangoJSONEncoder) 
+1

Cool. To załatwia sprawę. –

+0

Mam tutaj problem. Ustawiłem kontekst na 2 punkty dziesiętne, ale cały czas zrzucam 8 lub 10 punktów dziesiętnych. Czego tu mi brakuje? – Cheluis

+2

Zauważ, że otrzymasz błąd "TypeError", jeśli serializujesz zestaw zapytań podczas używania '.values' lub' .values_list', który zwraca 'ValuesQuerySet' - wymusza na liście, aby działał tak, używając powyższego jako przykładu, : 'data = simplejson.dumps (list (ql), cls = DjangoJSONEncoder)' –

1

Oto odpowiedź znalazłem na to pytanie: Python JSON serialize a Decimal object

Jak o instacji json.JSONEncoder?

class DecimalEncoder(simplejson.JSONEncoder): 
    def _iterencode(self, o, markers=None): 
     if isinstance(o, decimal.Decimal): 
      # wanted a simple yield str(o) in the next line, 
      # but that would mean a yield on the line with super(...), 
      # which wouldn't work (see my comment below), so... 
      return (str(o) for o in [o]) 
     return super(DecimalEncoder, self)._iterencode(o, markers) 

W twoim przypadku, należy używać go tak:

data = simplejson.dumps(ql, cls=DecimalEncoder) 
+0

Wciąż otrzymuję ten sam błąd w tej metodzie. –

Powiązane problemy