You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django DRF中按指定嵌套格式序列化封装Product字段

实现嵌套Product字段的方案

新增单独的产品基础信息序列化器,在原序列化器中嵌套调用即可,修改serializers.py如下:

# 新增产品基础信息序列化器,负责输出Product对象自身的字段
class ProductBaseSerializer(serializers.ModelSerializer):
    product_image = serializers.SerializerMethodField()
    p_id = serializers.SerializerMethodField()

    class Meta:
        fields = [
            "p_id", "group_id", "product_name", "is_prescription_needed",
            "product_description", "product_keypoint", "product_type", "product_image", 
            "pack", "pack_unit", "hsn", "company", "brand_id", "composition", 
            "drug_details", "uses", "side_effects", "cope_side_effects", 
            "how_it_works", "safety_advice", "what_if_forget", "medical_constraints", 
            "created_at", "created_by", "modified_at", "modified_by"
        ]
        model = Product

    def get_product_image(self, obj: Product):
        return obj.image.strip() if obj.image else ""

    def get_p_id(self, obj):
        return obj.id

# 修改原有的ProductSerializer,只保留关联字段和嵌套的Product字段
class ProductSerializer(serializers.ModelSerializer):
    Category = ProductCategorySerializer(source='category', read_only=True)
    Sub_category = ProductSubCategorySerializer(source='sub_category', read_only=True)
    # 新增嵌套Product字段,source='self'表示将当前Product实例传给嵌套序列化器
    Product = ProductBaseSerializer(source='self', read_only=True)

    class Meta:
        fields = ["Category", "Sub_category", "Product"]
        model = Product

上述修改后即可输出你期望的嵌套结构。


现有代码可优化点

  • 序列化器冗余逻辑优化
    • 无需用SerializerMethodField做简单的字段重命名:比如c_id可以直接写为c_id = serializers.IntegerField(source='id'),is_active2可以直接写为is_active2 = serializers.IntegerField(source='is_active'),无需额外写get_*方法,减少冗余代码。
    • 空值判断逻辑简化:原有get_product_image的长度判断可以简化为字符串去空判断,覆盖空字符串、None等多种空值场景。
  • 视图层规范与简化
    • 接口请求方式优化:分类查询属于读操作,建议改为GET请求更符合RESTful规范,参数传递也更符合常规使用习惯。
    • 参数默认值简化:无需写if-else判断参数是否存在,直接用dict.get的默认参数即可:category = request.query_params.get("category", 1),sub_category = request.query_params.get("sub_category", 1)。
    • 复用DRF内置能力:继承GenericAPIView后可以直接配置serializer_class = ProductSerializer、queryset = Product.objects.all(),同时可以直接开启内置分页能力,无需手动处理序列化逻辑,同时建议增加参数合法性校验,避免传入非数字的分类ID导致查询报错。
    • 类名命名优化:视图类名建议遵循大驼峰规范,改为CategoryProductView更易读。
  • 模型层适配优化
    • 布尔类型字段优化:is_active、is_prescription_needed这类二值字段建议用BooleanField映射,返回布尔值给前端比返回1/0更友好,即使表中存储的是整数,DRF也会自动做类型转换。
    • 冗余配置删除:外键字段的db_column值和字段名一致时,可以省略db_column配置,Django默认会用字段名作为表列名。

内容的提问来源于stack exchange,提问作者Ajay Chaurasia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 12:42:01