作为JSON字符串数组而不是键值数组返回

时间:2018-08-12 05:06:04

标签: python django django-rest-framework django-serializer

我正在使用Django编写Web服务,并试图创建一个API,该API返回MySQL数据库中表中的所有不同类别。表模式如下:

+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| id            | int(11)      | NO   | PRI | NULL    | auto_increment |
| news_id       | int(11)      | YES  | MUL | NULL    |                |
| news_category | varchar(50)  | YES  |     | NULL    |                |
| publish_date  | varchar(50)  | YES  |     | NULL    |                |
| news_link     | varchar(255) | NO   |     | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+

这里的news_category字段不是唯一的。我希望API以以下JSON格式列出所有不同的类别:

{
    "count": 22,
    "next": null,
    "previous": null,
    "results": ["apple", "google", "microsoft", "apps", "photography", "virtual-reality", "business"]
}

以下是我的models.py

from django.db import models
...
class NewsInfo(models.Model):
    news = models.ForeignKey(NewsContent, models.DO_NOTHING, blank=True, null=True)
    news_category = models.CharField(max_length=50, blank=True, null=True)
    publish_date = models.CharField(max_length=50, blank=True, null=True)
    news_link = models.CharField(max_length=255)

    def __str__(self):
        return self.news.news_title

    class Meta:
        managed = False
        db_table = 'news_info'

serializers.py

from .models import NewsInfo
from rest_framework import serializers
...
class NewsInfoSerializer(serializers.ModelSerializer):
    class Meta:
        fields = ['news_category', 'news_link', 'news']
        model = NewsInfo

class NewsCategorySerializer(serializers.ModelSerializer):
    class Meta:
        fields = ['news_category']
        model = NewsInfo

views.py

from rest_framework import viewsets
from .models import NewsInfo
from .serializers import NewsCategorySerializer
...
class CategoryViewSet(viewsets.ModelViewSet):
    queryset = NewsInfo.objects.values('news_category').distinct()
    serializer_class = NewsCategorySerializer

我在这里得到响应,但是像这样的键值对:

{
    "count": 22,
    "next": null,
    "previous": null,
    "results": [{
        "news_category": "apple"
    }, {
        "news_category": "google"
    }, {
        "news_category": "microsoft"
    }, {
        "news_category": "apps"
    }, {
        "news_category": "photography"
    }, {
        "news_category": "virtual-reality"
    }, {
        "news_category": "business"
    }]
}

无论我尝试什么,我都无法获得想要的结果。请帮忙。

1 个答案:

答案 0 :(得分:3)


覆盖 to_representation() 序列化器的 NewsCategorySerializer 方法
class NewsCategorySerializer(serializers.ModelSerializer):
    class Meta:
        fields = ['news_category']
        model = NewsInfo

    def to_representation(self, instance):
        return super().to_representation(instance)['news_category']