2

I am trying to get data in a particular format but i'm not able to get the desired output.

My Model:

class Category(models.Model):
    name = models.CharField(max_length=40)


class Expense(models.Model):

    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name="category_name")
    description = models.CharField(max_length=200)
    total_amount = models.IntegerField()


class Expense_Details(models.Model):

    expense = models.ForeignKey(Expense, on_delete=models.CASCADE, related_name="payment")  
    user = models.IntegerField()
    amount = models.FloatField()
    type = models.CharField(max_length=100)   ---->type is owe or lend

When I request /api/expenses/:

Expected Output
{
  “total_expenses”: 10, 
  “Expenses”: 
               [{
               “id”: 1,
               “category”: 1,
               “created_by”: 1,     ------> user logged id
               “description”: “lunch”,
               “total_amount”: “105”,
               “owe”: [{
                        “user_id”: 1,
                        “amount”: 10
                      },
                      {
                        “user_id”: 2,
                        “amount”: 95
                       }],

               “lend”: [{
                        “user_id”: 3,
                        “amount”: 10
                      },
                      {
                        “user_id”: 4,
                        “amount”: 95
                       }],
                  }, ...
                  ]
  }

My output:

  {
"results": [
    {
        "id": 1,
        "category": 1,
        "description": "lunch at the burj al arab",
        "total_amount": 105,
        "payment": [
            {
                "user": 1,
                "amount": -10
            },
            {
                "user": 2,
                "amount": -95
            },
            {
                "user": 3,
                "amount": 10
            },
            {
                "user": 4,
                "amount": 95
            }
        ]
      }
    ]
 }

My Serializer:

class ExpenseDetailsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Expense_Details
        fields = ['user', 'amount']


class ExpenseSerializer(serializers.ModelSerializer):
    payment = serializers.SerializerMethodField()

    def get_payment(self, obj):
        return ExpenseDetailsSerializer(obj.payment.all(), many=True).data

    class Meta:
        model = Expense
        fields = ['id', 'category', 'description', 'total_amount', 'payment',]

What Query should I use to get Output in the above format? How will my serializer look like? How can I separate own and lend? Also I have stored own and lend with + and - sign to differentiate between them.

code_nation
  • 103
  • 6

1 Answers1

0

Use a ListField for the same.

Documentation: https://www.django-rest-framework.org/api-guide/fields/#listfield

Also refer How to serialize an 'object list' in Django REST Framework

Here you can try something like:

class ExpenseSerializer(serializers.Serializer):
    payment = serializers.ListField(child=ExpenseDetailsSerializer())

    def get_payment(self, obj):
        return ExpenseDetailsSerializer(obj.payment.all(), many=True).data

    class Meta:
        model = Expense
        fields = ['id', 'category', 'description', 'total_amount', 'payment',]