在Django Rest Framework中覆盖JSON数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Django Rest Framework中覆盖JSON数据相关的知识,希望对你有一定的参考价值。

现在使用当前的Views函数,我得到的数据如下:

{"item": "zxmnb",
"category": "zxc",
"price": "zxc",
"restaurant": 1}

这是我的观点文件:

class RestaurantMenuView(generics.RetrieveAPIView):
    lookup_field = 'item'
    serializer_class = MenuSerializer

    def get_queryset(self):
        return Menu.objects.all()

但问题是我希望数据格式为:

{"restaurant": "name"
"item":"some item",
"category": "some category",
"price": "some price"
}

我想提一下,餐厅是我模特课上的另一个模特,现在我知道,如果我使用餐厅,我只会获得pk。但我想要的是像这样显示的JSON。

答案

为什么不重新定义to_representation()函数。像这样的东西:

class MenuSerializer(serializers.ModelSerializer):
    def to_representation(self, obj):
        restaurants = RestaurantSerializer(instance=obj, 
        context=self.context).data
        data = []
        for restaurant in restaurants:
            data.append(
                {
                    "restaurant": {
                        "item": obj.item,
                        "category": obj.category,
                        "price": obj.price,
                        "name": restaurant.name,
                    }
                }
            )
        return data

在没有查看你的模型或为什么你想要餐厅的情况下,我添加了for循环以向您展示您可以访问to_representation()中的任何数据并将其放入您想要的任何格式。当我尝试以特定方式将JSON对象渲染为XML时,我会使用它。希望这可以帮助。

另请查看文档:https://www.django-rest-framework.org/api-guide/serializers/#overriding-serialization-and-deserialization-behavior

您可以考虑的另一个解决方案是将菜单模型上的外键添加回餐厅,然后您可以像这样定义序列化程序:

class RestaurantSerializer(serializers.ModelSerializer):
    menu = MenuViewSerializer(read_only=True, many=True)

    class Meta:
        model = Restaurant
        fields = [
            "id",
            "name",
            "menu",
        ]
        extra_kwargs = {
            "menu": {"read_only": True},
        }
另一答案

你需要修改你的MenuSerializer。具体来说,您需要将restaurant字段更改为CharField并提供source属性。类似于以下内容:

class MenuSerializer(serializers.ModelSerializer):
    restaurant = serializers.CharField(source='restaurant.name')
    # ... other stuff in the serializer

在这里,我假设你的Restaurant模型有一个name字段。

您可以在这里阅读有关Serializer字段的更多信息:https://www.django-rest-framework.org/api-guide/fields/

以上是关于在Django Rest Framework中覆盖JSON数据的主要内容,如果未能解决你的问题,请参考以下文章

Django REST Framework 中的否定或排除过滤器

使用 Django REST Framework 作为 Django 的身份验证后端

如何在 Django REST framework JWT 中指定我自己的数据值?

django rest framework jwt 使用电子邮件和密码进行身份验证

在 django-rest-framework-jwt 中存储超过默认信息

在 django-rest-framework 中插入 django-allauth 作为端点