如何按字段对 Django Rest Framework 序列化器中的嵌套列表进行排序?

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

这是我在前端收到的数据。

{
  id: 1,
  tenant_id: 73,
  product_channel: 2,
  revision_status: "Effective",
  cou_charges_detail_row: [
    {
      biller_category_ref_id: 23,
      rate_flag: false,
      rate_percentage: "0.75",
      min_value: 1,
      max_value: 5000,

    },
    {
      biller_category_ref_id: 18,
      rate_flag: false,
      rate_percentage: "0.30",
      min_value: 1,
      max_value: 10000,
    },
    {
      .... 31 rows more
    },
  ],
}

我想从后端发送按biller_category_ref_id升序排序的cou_charges_detail_row。

{
  id: 1,
  tenant_id: 73,
  product_channel: 2,
  revision_status: "Effective",
  cou_charges_detail_row: [
    {
      biller_category_ref_id: 18,
      rate_flag: false,
      rate_percentage: "0.30",
      min_value: 1,
      max_value: 10000,

    },
    {
      biller_category_ref_id: 23,
      rate_flag: false,
      rate_percentage: "0.75",
      min_value: 1,
      max_value: 5000,
    },
    {
      .... 31 rows more
    },
  ],
}

以下是我的模型、序列化器和视图中的相关代码片段,供参考。我正在寻求正确排序 cou_charges_detail_row 列表的指导。

views.py

class COUChargesViewSet(viewsets.ModelViewSet):
    queryset = CustomerOUCharges.objects.filter(is_deleted=False, is_active=True).order_by('-id')
    serializer_class = COUChargesSerializer

    def list(self, request):
        tenant_id = LoginSerializer.get(request.user).values_list("tenant_id", flat=True)
        if 'id' in self.request.GET:
            charges_obj = CustomerOUCharges.objects.filter(is_deleted=False,id = request.GET["id"]).exclude(revision_status='History').order_by('-id')
            serializer = self.get_serializer(charges_obj, many=True)
            return Response(serializer.data)
        else:
            charges_obj = CustomerOUCharges.objects.filter(tenant_id__in =tenant_id, is_deleted=False, is_active=True).exclude(revision_status='History').order_by('-id')
            serializer = COUChargesSerializer(charges_obj, many=True)
            return Response(serializer.data)

序列化器.py

class COUChargesSerializer(serializers.ModelSerializer):
    tenant_name = serializers.CharField(source=varible_class.tenant_id_tenant_name, read_only=True)
    cou_charges_detail_row = COUChargesDetailsSerializer(many=True)

    class Meta:
        model = CustomerOUCharges
        fields = ('__all__')


class COUChargesDetailsSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(required=False)

    class Meta:
        model = CustomerOUChargesDetails
        fields = '__all__'
        list_serializer_class = FilterDeleteListSerializer

模型.py

class CustomerOUCharges(models.Model):
    tenant_id = models.ForeignKey(Tenant, verbose_name="COU Tenant Id", on_delete=models.PROTECT,related_name='customerou_tenant_id')
    product_channel = models.ForeignKey(ProductChannelMst, verbose_name=product_channel, on_delete=models.PROTECT, related_name='customerou_charges_product_channel')
    revision_status = models.CharField(choices=REVISION_STATUS_CHOICES, max_length=20, verbose_name=revision_status)


class CustomerOUChargesDetails(models.Model):
    header_ref_id = models.ForeignKey(CustomerOUCharges, default=0, verbose_name=header_ref_id,on_delete=models.PROTECT, related_name='cou_charges_detail_row')
    biller_category_ref_id = models.ForeignKey(BillerCategory, verbose_name=biller_cat_id, on_delete=models.PROTECT, blank=True, null=True)
    rate_flag = models.BooleanField(default=False, verbose_name=rate_flag)
    rate_percentage = models.DecimalField(default=0, max_digits=10, decimal_places=2, verbose_name=rate_percentage, blank=True, null=True)
    min_value  = models.IntegerField(default=0, verbose_name=min_value)
    max_value  = models.IntegerField(default=0, verbose_name=max_value)
django django-models django-rest-framework django-views django-forms
1个回答
0
投票

您可以在 COUChargesSerializer 序列化器中重写 to_representation 方法。您可以在其中传递基于 biller_category_ref_id 排序的排序 CustomerOUChargesDetails 查询集。

class COUChargesSerializer(serializers.ModelSerializer):
    tenant_name = serializers.CharField(source=varible_class.tenant_id_tenant_name, read_only=True)

    class Meta:
        model = CustomerOUCharges
        fields = ('__all__')

    def to_representation(self, instance):
        response = super(COUChargesSerializer, self).to_representation(instance=instance)
        customer_ou_charges_details_queryset = self.instance.cou_charges_detail_row.order_by('-biller_category_ref_id')
        response["cou_charges_detail_row"] = COUChargesDetailsSerializer(
            customer_ou_charges_details_queryset,
            many=True
        ).data
        return response


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