【问题标题】:To return custom field in DjangoRestFramework after aggregation聚合后返回 DjangoRestFramework 中的自定义字段
【发布时间】:2021-06-29 21:44:12
【问题描述】:

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

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

urls.py

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

我将使用下面的 api.py 文件使用 Transaction 模型返回聚合字段,查询工作正常,我只需要返回适当的响应。在这里,我将其中一个字段设为 Decimal,因此尝试使用 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 ....

models.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)

serializer.py

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

【问题讨论】:

    标签: json python-3.x rest django-models django-rest-framework


    【解决方案1】:

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

    serializer.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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 2022-11-23
      • 2021-06-25
      • 1970-01-01
      • 2018-06-13
      • 2014-08-25
      • 1970-01-01
      相关资源
      最近更新 更多