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

如何在Django+Angular UI-Grid中以DRY方式实现前后端字段混淆映射?

解决方案:Django + Angular UI-Grid 前后端字段安全映射

针对你这个需要隐藏后端模型字段名、同时符合DRY原则的需求,这里有几个实用方案,代码量少且易于维护:

方案1:定义统一字段映射字典(轻量灵活)

核心思路是在前后端共用一套字段别名与真实字段的映射关系,集中管理映射规则,避免重复代码。

步骤1:后端定义映射常量

在Django项目中创建一个常量文件(比如constants.py)或者直接在模型文件里定义映射:

# constants.py
FIELD_MAPPING = {
    'pn': 'part_name',   # 前端别名 → 后端真实字段
    'pid': 'part_id',
    'qty': 'quantity',
    'tk': 'ticket',
    'cmt': 'comments'
}
# 反向映射(可选,用于前端获取数据时转别名)
REVERSE_FIELD_MAPPING = {v: k for k, v in FIELD_MAPPING.items()}

步骤2:前端UI-Grid使用别名配置列

在Angular的控制器里,用别名定义UI-Grid的列:

$scope.gridOptions = {
    columnDefs: [
        { name: 'pn', displayName: 'Part Name' },
        { name: 'pid', displayName: 'Part ID' },
        { name: 'qty', displayName: 'Quantity' },
        { name: 'tk', displayName: 'Ticket' },
        { name: 'cmt', displayName: 'Comments' }
    ],
    // 其他网格配置...
};

前端提交数据时,直接发送带别名的JSON即可。

步骤3:后端视图转换字段并批量保存

在Django视图中,将前端的别名转换为真实字段名,同时用bulk_create提升性能:

from django.http import JsonResponse
from .models import Order_Detail
from .constants import FIELD_MAPPING

def save_order_details(request):
    if request.method == 'POST':
        # 解析前端传入的JSON数据(用json.loads替代ast.literal_eval更安全)
        import json
        grid_data = json.loads(request.POST.get('data'))
        
        # 批量转换字段名,只保留映射内的字段(防止恶意数据)
        mapped_items = []
        for item in grid_data:
            mapped_item = {FIELD_MAPPING[k]: v for k, v in item.items() if k in FIELD_MAPPING}
            mapped_items.append(mapped_item)
        
        # 批量创建数据,比逐个save高效
        Order_Detail.objects.bulk_create([Order_Detail(**item) for item in mapped_items])
        return JsonResponse({'status': 'success'})

方案2:用Django REST Framework Serializer(规范且安全)

如果你的项目已经在用DRF,用Serializer来做字段映射是更规范的选择,它还能自动处理数据验证、类型转换,完全符合DRY原则。

步骤1:定义带别名的Serializer

from rest_framework import serializers
from .models import Order_Detail

class OrderDetailSerializer(serializers.ModelSerializer):
    # 前端别名 = 序列化字段(source指向后端真实字段)
    pn = serializers.CharField(source='part_name')
    pid = serializers.CharField(source='part_id')
    qty = serializers.IntegerField(source='quantity')
    tk = serializers.CharField(source='ticket')
    cmt = serializers.CharField(source='comments')

    class Meta:
        model = Order_Detail
        fields = ['pn', 'pid', 'qty', 'tk', 'cmt']

步骤2:DRF视图处理请求

from rest_framework.decorators import api_view
from rest_framework.response import Response
from .serializers import OrderDetailSerializer

@api_view(['POST'])
def save_order_details(request):
    # many=True表示接受批量数据
    serializer = OrderDetailSerializer(data=request.data, many=True)
    if serializer.is_valid(raise_exception=True):
        serializer.save()
        return Response({'status': 'success'})

前端直接发送带别名的数组JSON,Serializer会自动完成字段映射、数据验证和保存,代码量极少。

关键注意事项

  • 数据验证:无论用哪个方案,都要过滤掉不在映射内的字段,避免恶意数据注入(方案1的if k in FIELD_MAPPING、方案2的Serializer自动过滤)。
  • 性能优化:用bulk_create批量创建数据,比循环逐个save效率提升数倍,尤其适合大量数据的场景。
  • 前后端一致性:映射规则要保持前后端统一,建议后端通过接口把映射返回给前端,避免硬编码不一致的问题。

内容的提问来源于stack exchange,提问作者KC-A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:02:49