2016-08-04 8 views
1

django rest-frameworkシリアライザの新機能です。上記のコードからdjangoの既存のシリアライザに余分なデータを追加する方法

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') 

私は、私は存在していない以下のJOSN data.Like(へ(利用可能な、アサイン)2つのフィールドを追加する必要があります。ここ

{ 
    "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 
    } 
] 
} 

下のような結果を得ました 最終的なJSONは以下のようになります。これを達成する方法?

{ 
    "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  
    } 
    ] 
} 

答えて

7

あなたはSerializerMethodFieldは、オブジェクトの直列化表現に余分なデータを追加するために使用することができます。

これは読み取り専用のフィールドです。 のメソッドを呼び出して、その値を取得します。これを使用して、オブジェクトのシリアライズされた表現に任意のソート データを追加できます。

シリアライザでは、AvailableAssignSerializerMethodフィールドを追加します。これを行うと、シリアル化されたデータに常にAvailableAssignのキーが追加されます。

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

モデルのメソッドではなく、ここでこれを行う利点は何ですか? – zemekeneng

+0

'request'に基づいて値を計算するか、' kwargs'と言うと、シリアライザコンテキストからこれらの値にアクセスし、これらのパラメータに基づいて最終値を計算して返すことができます。 –

関連する問題