Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django RestFramwork中重写JSON数据_Python_Json_Django_Django Rest Framework - Fatal编程技术网

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应返回与该餐厅关联的所有菜单子项。