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

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})

关键修正点

  1. 查询条件优化:用Q对象实现OR逻辑,精准筛选当前用户作为发起者或接收者的已通过请求
  2. 批量查询提升性能:先收集所有目标用户ID,再一次性查询RegUsers,避免循环中多次查询数据库
  3. 手动序列化:将模型对象转为字典结构,确保JsonResponse能正确生成合法JSON,解决"invalid JSON"错误
  4. 无外键兼容:完全通过ID字段关联两张表,不需要设置任何外键关系

常见问题排查

  • 如果仍返回JSON错误,检查RegUsers模型中是否包含无法序列化的字段(如FileField、自定义对象等),需单独处理这些字段的序列化
  • 确保Requests表的status字段值与筛选条件完全匹配(注意大小写,比如"Aprv"和"aprv"会被视为不同值)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:18:17