2016-07-31 14 views
0

Ich verwende Python json.dumps(), um ein Array in eine Zeichenfolge zu konvertieren und dann in einem Django-Modell zu speichern. Ich versuche herauszufinden, wie ich Djangos REST-Framework dazu bringen kann, dieses Feld zu ignorieren und es "wie es ist" zu senden, ohne es ein zweites Mal zu serialisieren.Serialisieren einer Zeichenfolge ohne Änderungen in Django Rest Framework?

Zum Beispiel, wenn das Modell sieht wie folgt aus (Beide Felder sind CharFields):

name = "E: \"

path_with_ids = "[{" name ":" E: \ " "id": 525}]"

möchte ich den Rest Rahmen 'path_with_ids' zu ignorieren, wenn die Serialisierung so die JSON Ausgabe wie folgt aussehen:

{ "name": "E: \", "path_with_ids": [{ "name": "E: \", "id": 525}]}

und nicht so:

{ "name": "E: \", "path_with_ids": "[{\" Name \ ": \" E: \\\ "\ "id \": 525}]"}

ich habe versucht, eine andere Serializer Klasse zu machen, die die Eingabe wird es spucken ohne Erfolg ‚as is‘:

Serializers.py:

class PathWithIds(serializers.CharField): 

    def to_representation(self, value): 

     return value.path_with_ids 

class FolderSerializer(serializers.ModelSerializer): 

field_to_ignore = PathWithIds(source='path_with_ids') 

    class Meta: 
     model = Folder 
     fields = ['id', 'field_to_ignore'] 

Bitte um Hilfe!

Antwort

1

I am Ende mit einer verschwenderisch und sickening Methode der Deserialisieren des Arrays, bevor es wieder mit dem restlichen Rahmen der Serialisierung:

Serializers.py:

import json 
class PathWithIds(serializers.CharField): 

    def to_representation(self, value): 

     x = json.loads(value) 
     return x 

class FolderSerializer(serializers.ModelSerializer): 

    array_output = PathWithIds(source='field_to_ignore') 

     class Meta: 
      model = Folder 
      fields = ['id', 'array_output'] 

Output im Rest API:

{ "name": "E: \", "array_output": [{ "name": "E: \", "id": 525 } ]}

+1

Das ist völlig vernünftig, da Sie ein Feld zu einem nativen Typ Umwandlung . Was Sie erhoffen, umgeht den Serialisierungsprozess vollständig und wäre nur ein Blind-Append, der sehr leicht versagen könnte. – Soviut