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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 13:27:01