2016-08-04 11 views
1

Ich bin neu bei den Django Rest-Framework-Serialisierern.So hängen Sie zusätzliche Daten an den vorhandenen Serializer in Django an

views.py 
@csrf_exempt 
@api_view(['GET'])   
def getAllAvailableEmps(request): 
    if request.method == 'GET': 
     try: 
      roleId = request.GET['emp_role_id'] 
      getEmp = emp_details.objects.filter(emp_dc_id = None,emp_active = True,emp_role_id = roleId) 
      serializer = getEmpDcSerializer(getEmp,many=True) 
      return JSONResponse({"allAvilableEmps":serializer.data}) 
     except Exception as e: 
      return JSONResponse("Failure "+str(e)) 

serializers.py 
class getEmpDcSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = emp_details 
     fields = ('emp_id','emp_dc_id','emp_first_name','emp_last_name','emp_role_id') 

aus dem obigen Code bekam ich das Ergebnis wie unter

{ 
    "allAvilableEmps": [ 
    { 
     "emp_id": 13, 
     "emp_dc_id": [], 
     "emp_first_name": "aaa", 
     "emp_last_name": "bb", 
     "emp_role_id": 4 
    }, 
    { 
     "emp_id": 16, 
     "emp_dc_id": [], 
     "emp_first_name": "cccc", 
     "emp_last_name": "ddd", 
     "emp_role_id": 4 
    } 
] 
} 

Hier, ich brauche zwei weitere Felder (verfügbar, Assign) zum JOSN data.Like unten (die existieren nicht hinzufügen in der Datenbank) .. Also endgültige JSON sollte wie folgt sein. Wie erreiche ich das?

{ 
    "allAvilableEmps": [ 
    { 
     "emp_id": 13, 
     "emp_dc_id": [], 
     "emp_first_name": "aaa", 
     "emp_last_name": "bb", 
     "emp_role_id": 4 
     "Available":1, 
     "Assign":2  
    }, 
    { 
     "emp_id": 16, 
     "emp_dc_id": [], 
     "emp_first_name": "cccc", 
     "emp_last_name": "ddd", 
     "emp_role_id": 4 
     "Available":1, 
     "Assign":2  
    } 
    ] 
} 

Antwort

7

können Sie verwenden SerializerMethodField zusätzliche Daten zu der serialisierten Darstellung eines Objekts hinzuzufügen.

Dies ist ein schreibgeschütztes Feld. Es erhält seinen Wert, indem es eine Methode auf die Serializer-Klasse aufruft, an die es angeschlossen ist. Es kann verwendet werden, um beliebige Daten der serialisierten Darstellung Ihres Objekts hinzuzufügen.

In Ihrem Serializer, fügen Available und AssignSerializerMethod Felder aus. Dadurch werden immer Available und Assign Schlüssel in Ihren serialisierten Daten hinzugefügt.

class getEmpDcSerializer(serializers.ModelSerializer): 
    Available = serializers.SerializerMethodField() # add field 
    Assign = serializers.SerializerMethodField() # add field 

    class Meta: 
     model = emp_details 
     fields = ('emp_id','emp_dc_id','emp_first_name','emp_last_name','emp_role_id', 'Available', 'Assign') 

    def get_Available(self, obj): 
     # here write the logic to compute the value based on object 
     return 1 

    def get_Assign(self, obj): 
     # here write the logic to compute the value based on object 
     return 2 
+0

Was ist der Vorteil, dies hier statt als eine Methode auf dem Modell zu tun? – zemekeneng

+0

Ein möglicher Anwendungsfall ist, wenn Sie Wert basierend auf "Anfrage" oder sagen wir "Kwargs" berechnen möchten, dann können Sie diese aus dem Serializer-Kontext zugreifen und basierend auf diesen Parametern den endgültigen Wert berechnen und zurückgeben. –