【问题标题】:How to append extra data to the existing serializer in django如何将额外数据附加到 django 中的现有序列化程序
【发布时间】:2016-12-10 01:58:34
【问题描述】:

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

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

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

在这里,我需要向 JOSN 数据添加另外两个字段(可用,分配)。如下所示(数据库中不存在).. 所以最终的 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    
    }
  ]
}

【问题讨论】:

    标签: django serialization django-rest-framework


    【解决方案1】:

    您可以使用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
    

    【讨论】:

    • 在这里这样做而不是作为模型上的方法有什么好处?
    • 一个可能的用例是,如果您想根据request 或假设kwargs 计算值,那么您可以从序列化程序上下文中访问这些值,并根据这些参数计算并返回最终值。
    猜你喜欢
    • 2013-04-06
    • 1970-01-01
    • 2010-09-29
    • 2017-03-22
    • 2010-12-12
    • 2015-09-01
    • 2014-05-24
    • 1970-01-01
    • 2020-04-26
    相关资源
    最近更新 更多