首页 > 解决方案 > 如何序列化 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,但无法弄清楚为什么它没有添加状态名称。请任何人帮我解决这个问题。

标签: djangodjango-rest-framework

解决方案


所以我想出了这个问题的答案。

我不得不为此重写查询集,查询集看起来像这样。

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"]

更改此设置后,我能够获得所需的输出。我不确定这是最好的答案,但如果有人能够找到更好的答案,请告诉我。


推荐阅读