Django 如何分割Json字符串。?

Django 如何分割Json字符串。?,django,django-rest-framework,serialization,Django,Django Rest Framework,Serialization,我有4种型号类别,供应商,位置,产品供应商属于类别模型(供应商是类别的外键)。其余型号在供应商(位置,产品) ProductSerializer和LocationSerializer嵌套到供应商序列化程序,而供应商序列化程序嵌套到类别序列化程序 class ProductSerializer(WritableNestedModelSerializer): class Meta: model = Product fields = ['id', 'item_n

我有4种型号类别供应商位置产品供应商属于类别模型(供应商是类别的外键)。其余型号在供应商(位置产品

ProductSerializerLocationSerializer嵌套到供应商序列化程序,而供应商序列化程序嵌套到类别序列化程序

class ProductSerializer(WritableNestedModelSerializer):
    class Meta:
        model = Product
        fields = ['id', 'item_name', 'price']
        read_only_fields = ['id']

class LocationSerializer(WritableNestedModelSerializer):
    class Meta:
        model = Location
        fields = ['place']

class VendorSerializer(WritableNestedModelSerializer):
    vendor_location = LocationSerializer()
    product = ProductSerializer(many=True)

    class Meta:
        model = Vendor
        fields = ['vendor_name','vendor_location','product']
        read_only_fields = ['id']

class CategorySerializer(WritableNestedModelSerializer):
    vendor = VendorSerializer(many=True)
    class Meta:
        model = Category
        fields = ['id', 'category_name', 'tittle', 'vendor']
        read_only_fields = ['id']

#查看

class ProductView(APIView):
    permission_classes = [IsAuthenticated]
    def get(self, request, format=None, *args, **kwargs):
        products = Category.objects.all()
        serializer = CategorySerializer(products, many=True, context={'request': request})
        return Response({'response': 'ok', 'result': serializer.data})

#输出

{
    "response": "ok",
    "result": [
        {
            "id": 1,
            "category_name": "Cake",
            "tittle": "test title",
            "vendor": [                
                {
                    "vendor_name": "Test_Name",
                    "vendor_location": {
                        "place": "Test_Place"
                    },
                    "product": [
                        {
                            "id": 1,
                            "item_name": "test_1",
                            "price": 3200,
                        },
                        {
                            "id": 2,
                            "item_name": "test_2",
                            "price": 2010,

                        }
                    ]
                }
            ]
        }
    ]
}
{
    "response": "ok",
    "result": [
        {
            "id": 1,
            "category_name": "Cake",
            "tittle": "test title",
            "vendor": [                
                {
                    "vendor_name": "Test_Name",
                    "vendor_location": {
                        "place": "Test_Place"
                    },
                    "product": [
                        {
                            "id": 1,
                            "item_name": "test_1",
                            "price": 3200,
                        }

                    ]
                }
            ]
        },
        {
            "id": 1,
            "category_name": "Cake",
            "tittle": "test title",
            "vendor": [                
                {
                    "vendor_name": "Test_Name",
                    "vendor_location": {
                        "place": "Test_Place"
                    },
                    "product": [                  
                        {
                            "id": 2,
                            "item_name": "test_2",
                            "price": 2010,

                        }
                    ]
                }
            ]
        }
    ]
}
#预期产出

{
    "response": "ok",
    "result": [
        {
            "id": 1,
            "category_name": "Cake",
            "tittle": "test title",
            "vendor": [                
                {
                    "vendor_name": "Test_Name",
                    "vendor_location": {
                        "place": "Test_Place"
                    },
                    "product": [
                        {
                            "id": 1,
                            "item_name": "test_1",
                            "price": 3200,
                        },
                        {
                            "id": 2,
                            "item_name": "test_2",
                            "price": 2010,

                        }
                    ]
                }
            ]
        }
    ]
}
{
    "response": "ok",
    "result": [
        {
            "id": 1,
            "category_name": "Cake",
            "tittle": "test title",
            "vendor": [                
                {
                    "vendor_name": "Test_Name",
                    "vendor_location": {
                        "place": "Test_Place"
                    },
                    "product": [
                        {
                            "id": 1,
                            "item_name": "test_1",
                            "price": 3200,
                        }

                    ]
                }
            ]
        },
        {
            "id": 1,
            "category_name": "Cake",
            "tittle": "test title",
            "vendor": [                
                {
                    "vendor_name": "Test_Name",
                    "vendor_location": {
                        "place": "Test_Place"
                    },
                    "product": [                  
                        {
                            "id": 2,
                            "item_name": "test_2",
                            "price": 2010,

                        }
                    ]
                }
            ]
        }
    ]
}

在我的输出中,列出了两种产品。可能不止两个。我只需要一个产品下的产品。所有产品必须按照我在预期输出中提到的相同结构进行打印。我该怎么做?可能吗?有人能帮我吗?

您可以修改这行:

#旧版:
products=Category.objects.all()#确切地说,这些不是产品
#新的:
products=Product.objects.values_list('id',flat=True)#获取所有产品id
categories=Category.objects.filter(供应商\产品\中=产品)
并将
类别
发送到
类别序列化程序
,但这仍然不是您想要的,因为每个重复的类别都将包含所有产品的信息(而不仅仅是一个)。
从这一点上我会去哪里?我会在
VendorSerializer
中创建方法
get\u product
,并以某种方式保存信息
类别
/
供应商
,如果我们已经为此
类别
添加了
产品
,我会跳过下一步添加


还有,我还是不明白你为什么需要这种格式。

格式有什么不同?好像same@amankumar:在我的输出中,列出了两种产品。它可能有两种以上。我只需要一个产品在产品部分。我需要打印所有具有相同结构的产品从数据库的角度来看,这没有任何意义,多个产品与这1个类别相关,将所有产品都列在同一个类别中是正确的,并且查询不应返回相同的多个值times@LinhNguyen:好的。有没有办法像我上面提到的那样划分这个结构?可以这样划分吗?VendorSerializer类中的product=ProductSerializer(many=True)声明。。。它真的是一对多的关系吗?根据UI,开发人员告诉我构建这样的结构。我不知道这是否真的可能。这就是我发布这个问题的原因。我可以为您提供UI设计,您可以为该UI建议更好的Jason格式吗?请这样做,也许会提出更好的JSON格式。如果这是一个类别中的4种产品,那么您提供的响应完全有效和正确。你不想发送这么多重复的信息。前端开发人员可以很容易地将此响应映射到模型中,并在其中迭代产品。顶部部分的名称和标题取决于UI。这来自类别模型。产品有产品形象、商品名称、店名、位置和价格。店名和位置来自供应商模型。项目名称和价格将来自产品型号。有很多供应商,每个供应商都有多个产品。您建议该UI使用哪种产品。输出或预期输出。?