django - 如何序列化 DRF 中的注释和外键
问题描述
我有 2 个考虑以下示例模型的 Django 模型。
class Status(models.Model):
name = models.CharField(max_length=50)
class Resolution(models.Model):
resolution_status = models.ForiegnKey(Status)
resolver_name = models.CharField(max_length="50")
所以我想做的是从分辨率模型中获取不同状态的计数。
所以为此,我编写了一个看起来像这样的 ORM。
status_count = Resolution.objects.values('resolution_status').annotate(status_count=Count(
'resolution_status'))
因此,从上面的 ORM 中,我将从 Resolution 模型中获取不同的 resolution_status 及其计数。
所以主要问题是现在我想将查询集序列化为 JSON。所以为此,我编写了这样的序列化程序类。
class CountSerializer(serializers.ModelSerializer):
status_count = serializers.IntegerField()
resolution_status = serializers.CharField(source="resolution_status")
class Meta:
model = Resolution
fields = ["resolution_status", "status_count"]
从上面的序列化程序类中,我得到这样的 JSON 输出
我不想显示该特定状态的 ID,而是显示名称。
例如,它应该看起来像这样。
[
{
resolution_status: "Status Name", count: 100
},
{
resolution_status: "Status Name 1", count: 120
},
{
resolution_status: "Status Name 3", count: 80
},
{
resolution_status: "Status Name 4", count: 10
}
]
我用谷歌搜索了很多,并通过了一些 StackOverflow QA,但无法弄清楚为什么它没有添加状态名称。请任何人帮我解决这个问题。
解决方案
所以我想出了这个问题的答案。
我不得不为此重写查询集,查询集看起来像这样。
status_count = Resolution.objects.values('resolution_status').annotate(status_count=Count(
'resolution_status')).values('resolution_status__name', 'status_count')
在此之后,我不得不将模型序列化程序类字段更改为此
class CountSerializer(serializers.ModelSerializer):
status_count = serializers.IntegerField()
resolution_status = serializers.CharField(source="resolution_status__name")
class Meta:
model = Resolution
fields = ["resolution_status", "status_count"]
更改此设置后,我能够获得所需的输出。我不确定这是最好的答案,但如果有人能够找到更好的答案,请告诉我。
推荐阅读
- rest - 如何在招摇中更改查询参数名称?
- c - 为什么 fgets 会读取我在 scanf 中的第一个输入?
- javascript - 使用 Javascript 选择嵌套元素
- javascript - 如何仅在第一页加载时显示弹出窗口
- c++ - 想要检测特征并在 2 个不同的帧中匹配特征
- sas - 如何在SAS中按字母顺序对地址进行排序?
- javascript - ReactJS API 数据获取 CORS 错误
- python - 自动转换为新数据 - Pandas
- ms-access - MS Access:使用 acDialog 打开的报告在变得不可见时不会返回控制权
- python - 如何在熊猫中将连续第一次出现的“真”更改为假