Django多表查询报错invalid JSON,求修正语法(不使用外键)
解决Django跨表查询返回Invalid JSON的问题(无外键场景)
核心思路
先筛选当前用户参与的已通过请求,再批量关联查询对应用户数据,最后手动整理成可序列化结构返回,避免直接返回模型对象导致的JSON序列化错误。
修正后的APIView代码
from django.http import JsonResponse from django.db.models import Q from rest_framework.views import APIView from rest_framework.permissions import IsAuthenticated from .models import Requests, RegUsers class FrndsAPIView(APIView): permission_classes = [IsAuthenticated] def post(self, request): uid = request.user.id # 筛选当前用户参与的已通过请求 approved_reqs = Requests.objects.filter( status="Aprv", Q(from_id=uid) | Q(to_id=uid) ) # 收集需要查询的目标用户ID target_uids = [] for req in approved_reqs: target_uids.append(req.to_id if req.from_id == uid else req.from_id) # 批量查询目标用户,避免N+1查询 target_users = RegUsers.objects.filter(id__in=target_uids) # 整理为可序列化的字典列表 friend_list = [] for user in target_users: friend_list.append({ "id": user.id, "username": user.username, "email": user.email, # 根据你的RegUsers模型添加其他需要返回的字段 }) # 返回标准JSON格式响应 return JsonResponse({"friends": friend_list})
关键修正点
- 查询条件优化:用
Q对象实现OR逻辑,精准筛选当前用户作为发起者或接收者的已通过请求 - 批量查询提升性能:先收集所有目标用户ID,再一次性查询
RegUsers,避免循环中多次查询数据库 - 手动序列化:将模型对象转为字典结构,确保
JsonResponse能正确生成合法JSON,解决"invalid JSON"错误 - 无外键兼容:完全通过ID字段关联两张表,不需要设置任何外键关系
常见问题排查
- 如果仍返回JSON错误,检查
RegUsers模型中是否包含无法序列化的字段(如FileField、自定义对象等),需单独处理这些字段的序列化 - 确保
Requests表的status字段值与筛选条件完全匹配(注意大小写,比如"Aprv"和"aprv"会被视为不同值)
内容的提问来源于stack exchange,提问作者akash
相关产品推荐
相关产品推荐

