在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时,我会使用它。希望这可以帮助。
您可以考虑的另一个解决方案是将菜单模型上的外键添加回餐厅,然后您可以像这样定义序列化程序:
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 使用电子邮件和密码进行身份验证