如何在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
相关产品推荐
相关产品推荐

