json - 聚合后返回 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__'
解决方案
我在点击和试用后找到了答案,我使用自定义序列化程序返回必填字段。
序列化程序.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
推荐阅读
- aws-cdk - 如何从 AwsCustomResource (service: 'SecretsManager', action: 'getSecretValue') 返回的 SecretString 中获取纯文本值?
- .net - 在 macOS 上编译 F# 项目时,如何确保编译器可以找到 Mono 程序集“System.Numerics.dll”?
- html - 一个按钮就是不想居中
- javascript - 在打字稿中的类型之间转换时,有没有办法转换底层对象
- r - 如何计算 data.frame 的双边 t.test,其中 X 和 Y 的标准在另一列中指定?
- java - 将 Eclipse 中的 JavaFX 项目导出到可运行的 jar
- vue.js - 在 lunix 上运行 npm run build 时它不起作用
- kotlin - 函数接收器和@RestrictsSuspension
- javascript - 在 react.js 中为测验处理多个单选和复选框
- r - R - ifelse 不充当矢量化函数?