Django DRF不修改模型/数据库 如何为查询集响应新增额外输出字段
实现方案
你可以通过Django ORM的annotate方法在查询层面直接追加常量字段,完全不需要修改模型/数据库,也不会触发循环引用问题,同时性能最优,适合数千条数据的场景,步骤如下:
1. 先修正现有代码的基础笔误
避免运行时出现不必要的报错:
- 模型类
TblDemo中的Charfield写法错误,需改为CharField(F大写) - 视图中
tbl_name.objects.all()错误,模型类名为TblDemo,需改为TblDemo.objects.all() - 视图方法
tbl_list定义末尾缺少冒号
2. 修改views.py
导入ORM常量注解工具,在查询时直接追加三个额外字段:
from django.db.models import Value, CharField class data_fetch(viewsets.ViewSet): def tbl_list(self, request, format=None): serializer = Tbl_Serializer_input(data=request.data) if serializer.is_valid(): # 取校验后的入参,比直接取request.data更安全 valid_data = serializer.validated_data # 查询时直接追加三个常量字段,SQL层面处理,性能最高 queryset = TblDemo.objects.filter( tbl_name=valid_data["title"] ).annotate( # 从入参取refer_no refer_no=Value(valid_data["refer_no"], output_field=CharField()), # 硬编码全局统一值 density=Value("350gm/in", output_field=CharField()), material=Value("tek wood", output_field=CharField()) ) serializer = Tbl_Serializer_output(queryset, many=True) return Response(serializer.data)
3. 修改serializers.py的输出序列化器
新增三个对应字段即可,不需要额外处理逻辑:
class Tbl_Serializer_output(serializers.Serializer): tbl_id = serializers.CharField(max_length=50) refer_no = serializers.CharField(max_length=50) tbl_name = serializers.CharField(max_length=50) tbl_size = serializers.CharField(max_length=50) tbl_height = serializers.CharField(max_length=50) density = serializers.CharField(max_length=50) material = serializers.CharField(max_length=50)
修改完成后即可直接输出你需要的返回结构,三个额外字段仅在查询和序列化阶段存在,不会写入数据库。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

