django REST 框架删除嵌套 json

django REST framework remove nested json

我想从多个模型中获取数据,现在我是这样工作的:

class IGStatSerializer(serializers.ModelSerializer):
    class Meta:
        model = IGStat
        fields = [
            "account",
            "rank",
            "followers",
            "created",
        ]


class IGSerializer(serializers.ModelSerializer):
    stats = serializers.SerializerMethodField()

    class Meta:
        model = IGAccount
        fields = [
            "id",
            "username",
            "avatar",
            "brand",
            "stats",]
    def get_stats(self, instance):
        today = datetime.today() - timedelta(days=1)
        stat = instance.stats.all().filter(created__year=today.year,
                                           created__month=today.month,
                                           created__day=today.day)
        return IGStatSerializer(stat, allow_null=True, many=True).data

而 json 结果将是这样的:

{
                "id": 3613,
                "username": "beautyfromnaturehk",
                "avatar": "https://scontent-iad3-1.cdninstagram.com/v/t51.2885-19/s320x320/42763479_187833352109784_1648992215864705024_n.jpg?tp=1&_nc_ht=scontent-iad3-1.cdninstagram.com&_nc_ohc=Q4hJvaXL-vYAX--Ol1x&oh=e05aef733557c9951642c3c8b518d2f9&oe=607A54CC",
                "brand": 4172,
                "stats": [
                    {
                        "account": 3613,
                        "rank": 22822,
                        "followers": 21485,
                        "created": "2021-03-16T00:00:00Z"
                    }
                ]
            },

而在实际情况中,会出现多个模型组合在一起,嵌套很多json。 所以我想去掉嵌套并重命名字段名,像上面的情况应该是这样的:

{
            "id": 3613,
            "username": "beautyfromnaturehk",
            "avatar": "https://scontent-iad3-1.cdninstagram.com/v/t51.2885-19/s320x320/42763479_187833352109784_1648992215864705024_n.jpg?tp=1&_nc_ht=scontent-iad3-1.cdninstagram.com&_nc_ohc=Q4hJvaXL-vYAX--Ol1x&oh=e05aef733557c9951642c3c8b518d2f9&oe=607A54CC",
            "brand": 4172,
            "stats_account": 3613,
            "stats_rank": 22822,
            "stats_followers": 21485,
            "stats_created": "2021-03-16T00:00:00Z"
        },

嵌套的统计数据已删除并重命名其内容。

像这样在序列化程序中编写自定义 to_representation 函数

class IGStatSerializer(serializers.ModelSerializer):
    class Meta:
        model = IGStat
        fields = [
            "account",
            "rank",
            "followers",
            "created",
        ]


class IGSerializer(serializers.ModelSerializer):
    stats = serializers.SerializerMethodField()

    class Meta:
        model = IGAccount
        fields = [
            "id",
            "username",
            "avatar",
            "brand",
            "stats",]
    def get_stats(self, instance):
        today = datetime.today() - timedelta(days=1)
        stat = instance.stats.all().filter(created__year=today.year,
                                           created__month=today.month,
                                           created__day=today.day)
        return IGStatSerializer(stat, allow_null=True, many=True).data

    def to_representation(self, instance):
        data = super().to_representation(instance)
        stats = data.pop('stats', None)
        # If you are sure that there will be only one stats object
        for key, value in stats[0].items():
            data['stats_{key}'.format(key=key)] = value
        return data