This is the data I am receiving in the frontend.
{
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
},
],
}
I want to send the cou_charges_detail_row sorted by biller_category_ref_id in ascending order from the backend.
{
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
},
],
}
Here are relevant code snippets from my models, serializers, and views for reference. I'm seeking guidance to correctly sort the cou_charges_detail_row list.
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)
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
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)
You can override to_representation method in the COUChargesSerializer serializer. where you can pass sorted CustomerOUChargesDetails query set with sort based on biller_category_ref_id.
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__')
def to_representation(self, instance):
response = super(COUChargesSerializer, self).to_representation(instance=instance)
cou_charges_detail_row = response.get('cou_charges_detail_row', [])
cou_charges_detail_row.sort(key=lambda x: x['biller_category_ref_id'])
response["cou_charges_detail_row"] = cou_charges_detail_row
return response