django - 如何序列化自定义查询集结果?
问题描述
在 django 模型序列化器中,典型的用例如下
class SalesManSerializer(serializers.ModelSerializer):
class Meta:
module = models.SalesMan
fields = ('id', 'name')
id、name 均来自 salse man 模型。
但是,如果我有另一个引用 SalseMan 的名为 Order 的模型。我想查询每个销售人员得到多少订单。
SQL就像
SELECT ID, NAME, COUNT(ORDER.ID) FROM SALSE_MAN, ORDER WHERE ORDER.UID = SALSE_MAN.ID GROUP BY SALSE_MAN.ID
如何序列化这个查询?
解决方案
模型序列化器默认只序列化模型字段。但好消息是您始终可以将自定义字段添加到您的序列化程序。
不知道你的模型到底是什么,但在代码中它可能看起来像:
class SalesManSerializer(serializers.ModelSerializer):
total_orders = serializers.IntegerField()
class Meta:
module = models.SalesMan
fields = ('id', 'name', 'total_orders')
序列化器只负责序列化。他们不为我们构建查询集。也就是说,您需要自己注释查询集。无论是在视图中还是查询集将被初始化并传递给序列化程序的任何地方,您都可以使用注释来注释带有订单计数的对象。
例如:
class SalesManViewSet(viewsets.ModelViewSet):
serializer_class = SalesManSerializer
def get_queryset(self):
return SalesMan.objects.annotate(
total_trucks = Count('orders'),
)
推荐阅读
- google-apps-script - 为什么某些由带有表单提交触发器的 Google Apps 脚本发送的电子邮件会发送两次?
- build - 嵌入式领域中的“构建系统”是什么?
- c# - 尝试在 C# 中对具有多个线程的数组进行排序时出现问题
- python - 函数调用另一个函数
- android - 动态 URL PDF 在 WebView 中显示为“无可用预览”
- firebase - 如何使用 Flutter 获取 Firestore 中嵌套项目的数量
- xamarin - 如何在 iOS 上的 WKWebView 中启用视频自动播放
- javascript - google.script.run 在文件输入的情况下失败
- angular - 使用 concatMap 从链式 HTTP 调用返回 Observables
- node.js - Firebase cloudfunction functions.config() 在生产中返回一个空对象