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

如何在Django REST Framework中筛选并选择JSONField内的JSON数据

解决Django JSONField子数组过滤及实例筛选问题

实现步骤

  1. 筛选目标Form实例
    先通过ORM精准筛选出id为"A"和"B"的实例,直接使用id__in查询即可:

    target_forms = Form.objects.filter(id__in=["A", "B"])
    
  2. 按规则过滤children数组
    由于不同实例的children过滤规则存在差异,Django ORM的children__contains无法满足需求(该方法仅能检查JSON是否包含指定键值对结构,无法针对数组元素做差异化精准过滤),需要在Python层面遍历实例并处理:

    from rest_framework.response import Response
    from rest_framework.views import APIView
    
    class FormAPIView(APIView):
        def get(self, request):
            target_forms = Form.objects.filter(id__in=["A", "B"])
            response_data = []
            
            for form in target_forms:
                # 根据form.id应用对应过滤规则
                if form.id == "A":
                    filtered_children = [
                        child for child in form.children 
                        if child.get("id") == "propertyName#0"
                    ]
                elif form.id == "B":
                    allowed_ids = {"propertyName#0", "userName#0"}
                    filtered_children = [
                        child for child in form.children 
                        if child.get("id") in allowed_ids
                    ]
                else:
                    # 其他实例可默认返回原children或空数组,按需调整
                    filtered_children = form.children
                
                response_data.append({
                    "id": form.id,
                    "children": filtered_children
                })
            
            return Response(response_data)
    

关键说明

  • children__contains的局限性:该ORM查询仅能判断JSONField中是否包含指定的键值对结构,无法实现"针对不同父实例,过滤数组中特定id元素"的差异化需求,因此必须结合Python逻辑处理。
  • 性能提示:如果目标实例数量极少(仅A、B两个),上述遍历处理完全高效;若后续实例数量增多,可考虑提前缓存或优化查询逻辑。

内容的提问来源于stack exchange,提问作者Ganesh Panchoriya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:56:06