Reformat Django REST Framework Serializer to get Output

只谈情不闲聊 提交于 2020-06-16 03:35:10

问题


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.


回答1:


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',]


来源:https://stackoverflow.com/questions/61929711/reformat-django-rest-framework-serializer-to-get-output

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!