如何在Django REST Framework中筛选并选择JSONField内的JSON数据
解决Django JSONField子数组过滤及实例筛选问题
实现步骤
筛选目标Form实例
先通过ORM精准筛选出id为"A"和"B"的实例,直接使用id__in查询即可:target_forms = Form.objects.filter(id__in=["A", "B"])按规则过滤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
相关产品推荐
相关产品推荐

