Python 在Django RestFramwork中重写JSON数据
现在,通过当前视图功能,我获得以下数据:Python 在Django RestFramwork中重写JSON数据,python,json,django,django-rest-framework,Python,Json,Django,Django Rest Framework,现在,通过当前视图功能,我获得以下数据: {"item": "zxmnb", "category": "zxc", "price": "zxc", "restaurant": 1} 这是我的视图文件: class RestaurantMenuView(generics.RetrieveAPIView): lookup_field = 'item' serializer_class = MenuSerializer def get_queryset(self):
{"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像这样显示 您需要修改MenuSerializer。具体来说,您需要将restaurant字段更改为CharField,并提供一个属性。如下所示:
class MenuSerializer(serializers.ModelSerializer):
restaurant = serializers.CharField(source='restaurant.name')
# ... other stuff in the serializer
这里,我假设您的餐厅模型有一个名称字段
您可以在此处阅读有关序列化程序字段的更多信息:为什么不重新定义to_表示函数。大概是这样的:
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
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},
}
不看你的模型,也不看你为什么要在那里吃饭,我添加了for循环,以便向你展示,你几乎可以访问to_表示中的任何数据,并将其以你想要的任何格式放置。当我试图以一种特定的方式将JSON对象呈现为XML时,我会使用它。希望这有帮助
还可以查看以下文档:
另一个你可以考虑的解决方案是在菜单模型上添加外键回到餐厅,然后你可以像这样定义你的序列化器:
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
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},
}
您的预期输出不是JSONHey我更新了输出。这能实现吗?你能添加你的模型和序列化程序吗?这个答案真的很有帮助,我需要像{restaurant:[{key:value}]}这样的输出。我应该在那里使用什么视图来生成这种json响应?什么是[{key:value}]?这些价值从何而来?也许你可以尝试+我需要整个菜单列表,但它只是显示第一个菜单对象。这是我在模型中使用的字段,menu=mode.ForeignKeyMenu,在_delete=model.cascade上,您是否定义了明确定义所有字段的MenuViewSerializer?查看原始问题代码:尝试将视图集更改为:class RestaurantMenuViewgenerics.RetrieveAppView:lookup _field='item'序列化器_class=RestaurantSerializer def get\u querysetself:returnRestaurant.objects.all应返回与该餐厅关联的所有菜单子项。