我如何将它们中的两个结合起来并使用新字段创建新的序列化器

问题描述 投票:0回答:1

我在格式化DRF响应时遇到一个问题

我在这里共享我的模型详细信息

class Plan(AuditFields, Model):

    id = models.AutoField(primary_key=True)
    object_id = models.UUIDField(
        unique=True, editable=False, verbose_name='Public identifier')
    plan_name = models.CharField(max_length=255, blank=True)
    team = models.ManyToManyField(
        settings.AUTH_USER_MODEL, blank=True, related_name="%(app_label)s_%(class)s_team")


class PlanDetail(AuditFields, Model):
    plan = models.ForeignKey(
        Plan, on_delete=models.CASCADE, blank=True, null=True)
    plan_stage = models.CharField(max_length=255, blank=True)
    start_date = models.DateField(null=True, blank=True)
    end_date = models.DateField(null=True, blank=True)
    status_of_plan = models.CharField(max_length=255, blank=True)

使用上述模型,我需要创建这样的响应。但与此相关的是我遇到的一些问题

       plan details :  [
   {
            "plan_stage": "Sample1",
            "status_of_plan": "Completed",
            "start_date": "2019-07-01",
            "end_date": "2019-07-01",
        },
        {
            "plan_stage": "Sample2",
            "status_of_plan": "Not Commenced",
            "start_date": "2019-08-01",
            "end_date": "2019-08-31",
        },
        {
            "plan_stage": "Sample3",
            "status_of_plan": "Not Commenced",
            "start_date": "2019-09-01",
            "end_date": "2019-09-30",
        },
        {
            "plan_stage": "Sample4",
            "status_of_plan": "Not Commenced",
            "start_date": "2019-10-01",
            "end_date": "2019-10-31",
        },
        {
            "plan_stage": "Sample 5",
            "status_of_plan": "Completed",
            "start_date": "2019-11-01",
            "end_date": "2019-11-30",
        },
        {
            "plan_stage": "End Date (Final Report)",
            "status_of_plan": "Completed",
            "start_date": "2019-12-01",
            "end_date": "2019-12-31",
        }


    ]
plan :{
"id" : 1.
"object_id": 456789023456546,
"plan_name" : "Sample",
"team":['Sachin','Dravid']

}

我正在使用两个序列化器并对其进行尝试...但在这种情况下它不起作用

class PlanningSerializer(ModelSerializer):
 '''THis is for Model Plan '''
    team = TeamSerializer(many=True, read_only=True)

class Meta:
    model = Plan
    exclude = ['deleted_at']

class PlanningDetailsSerializer(ModelSerializer):
plan = PlanningSerializer(read_only=True)
    class Meta:
        model = PlanDetail
        exclude = ['deleted_at']

但是我面临一个问题

我正在收到这样的回复

[
    {
        "plan_stage": "Sample1",
        "status_of_plan": "Completed",
        "start_date": "2019-07-01",
        "end_date": "2019-07-01",
        "plan": {
                   "id" : 1.
                 "object_id": 456789023456546,
                 "plan_name" : "Sample",
                "team":['Sachin','Dravid']    
              }
    },
    {
        "plan_stage": "Sample2",
        "status_of_plan": "Not Commenced",
        "start_date": "2019-08-01",
        "end_date": "2019-08-31",
        "plan": {
                   "id" : 1.
                 "object_id": 456789023456546,
                 "plan_name" : "Sample",
                "team":['Sachin','Dravid']    
              }
    },
    {
        "plan_stage": "Sample3",
        "status_of_plan": "Not Commenced",
        "start_date": "2019-09-01",
        "end_date": "2019-09-30",
        "plan": {
                   "id" : 1.
                 "object_id": 456789023456546,
                 "plan_name" : "Sample",
                "team":['Sachin','Dravid']    
              }
    },
    {
        "plan_stage": "Sample4",
        "status_of_plan": "Not Commenced",
        "start_date": "2019-10-01",
        "end_date": "2019-10-31",
        "plan": {
                   "id" : 1.
                 "object_id": 456789023456546,
                 "plan_name" : "Sample",
                "team":['Sachin','Dravid']    
              }
    },
    {
        "plan_stage": "Sample 5",
        "status_of_plan": "Completed",
        "start_date": "2019-11-01",
        "end_date": "2019-11-30",
        "plan": {
                   "id" : 1.
                 "object_id": 456789023456546,
                 "plan_name" : "Sample",
                "team":['Sachin','Dravid']    
              }
    },
    {
        "plan_stage": "Sample6",
        "status_of_plan": "Completed",
        "start_date": "2019-12-01",
        "end_date": "2019-12-31",
        "plan": {
                   "id" : 1.
                 "object_id": 456789023456546,
                 "plan_name" : "Sample",
                "team":['Sachin','Dravid']    
              }
    }
]

如何将它们中的两个结合起来并使用新字段创建新的序列化器

django django-rest-framework serializer
1个回答
3
投票
将计划字段添加到您的PlanningDetailsS​​erializer排除字段。

class PlanningDetailsSerializer(ModelSerializer): class Meta: model = PlanDetail exclude = ['deleted_at', 'plan']

如果您希望在相同的响应中看到结果,则建议尝试此操作:

class PlanningAPIView(APIView): def get(self, request, *args, **kwargs): plan_details = PlanDetail.objects.all() # or some query plan = Plan.objects.all() # or some query plan_detail_serializer = PlanDetail(data=plan_details, many=True) plan_serializer = Plan(data=plan, many=True) return Response({"plan_details": plan_detail_serializer.data, "plan": plan_serializer.data}, status=status.HTTP_200_OK)

© www.soinside.com 2019 - 2024. All rights reserved.