如何将额外数据附加到django中的现有序列化程序

use*_*606 5 django serialization django-rest-framework

我是django rest-framework序列化程序的新手.

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')
Run Code Online (Sandbox Code Playgroud)

从上面的代码我得到如下的结果

{
  "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
    }
]
}
Run Code Online (Sandbox Code Playgroud)

在这里,我需要在JOSN数据中再添加两个字段(Available,Assign).如下所示(数据库中不存在).所以最终的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    
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

Rah*_*pta 12

您可以使用SerializerMethodField向对象的序列化表示添加额外数据.

这是一个只读字段.它通过调用附加到的序列化程序类上的方法来获取其值.它可用于将任何类型的数据添加到对象的序列化表示中.

在序列化程序中,添加AvailableAssign SerializerMethod字段.执行此操作将始终添加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
Run Code Online (Sandbox Code Playgroud)