首页 > 解决方案 > 聚合后返回 DjangoRestFramework 中的自定义字段

问题描述

stackoverflow 上有很多与自定义字段相关的答案,但是在尝试使用它们时,我遇到了不同的错误,因此发布了一个单独的问题。

我想为以下网址返回 JSON 响应

网址.py

path('cards/<int:pk>/smarts', smarts.as_view(), name="smarts"),

我将使用下面的 api.py文件使用事务模型返回聚合字段,查询工作正常,我只需要返回适当的响应。在这里,我有一个作为十进制的字段,因此尝试使用 DjangoJSONEncoder 但出现错误。

api.py

class smarts(generics.ListAPIView):
    serializer_class = TransactionSerializer
    permission_classes = [permissions.IsAuthenticated, TransactionIsOwnerOrNot]

    def get_queryset(self):
        card = get_object_or_404(self.request.user.cards, pk=self.kwargs['pk'])
        qs=card.transactions.values('vendor').annotate(a=Count('pk'),b=Sum('amount')).order_by('-b')
        ....CODE REQUIRED
        return ....

模型.py

class Transactions(models.Model):
    amount = models.DecimalField(max_digits=19, decimal_places=2)
    vendor = models.CharField(max_length=200)
    category = models.CharField(max_length=200)
    owner = models.ForeignKey(Cards, on_delete=models.CASCADE, related_name="transactions",null=True)

序列化程序.py

class TransactionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Transactions
        fields = '__all__'

标签: jsonpython-3.xrestdjango-modelsdjango-rest-framework

解决方案


我在点击和试用后找到了答案,我使用自定义序列化程序返回必填字段。

序列化程序.py

class SmartSerializer(serializers.Serializer):
    vendor = serializers.CharField(max_length=200)
    tot = serializers.IntegerField()
    tot_amt = serializers.DecimalField(max_digits=19, decimal_places=2)

api.py

class smartstatements(generics.ListAPIView):
    permission_classes = [permissions.IsAuthenticated, TransactionIsOwnerOrNot]
    serializer_class = SmartSerializer
    def get_queryset(self):
        card = get_object_or_404(self.request.user.cards, pk=self.kwargs['pk'])
        queryset=card.transactions.values('vendor')
                                      .annotate(tot=Count('pk'),tot_amt=Sum('amount'))
                                      .order_by('-tot_amt')
        return queryset

推荐阅读