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

使用Django Rest Framework结合JavaScript获取数据时遭遇500内部服务器错误的求助

问题分析与解决方案

你遇到的500错误核心原因很明确:Django的User模型实例无法直接被JSON序列化,你的serialize()方法里直接返回了self.user和完整的User对象列表,这就触发了序列化失败,进而导致服务器返回500内部错误。下面是具体的修复步骤:

1. 修复Post模型的serialize方法

把User对象替换成JSON可识别的基础数据类型(比如用户ID、用户名),修改后的代码如下:

# models.py
class Post(models.Model):
    user = models.ForeignKey(User,on_delete=models.PROTECT, default='',null=True)
    message = models.TextField()
    date = models.DateTimeField()
    likes = models.ManyToManyField(User,blank=True,null=True,related_name="posts")
    
    def serialize(self):
        return {
            "id": self.id,
            # 只返回用户的关键可序列化字段
            "user": {
                "id": self.user.id,
                "username": self.user.username
            } if self.user else None,
            # 同样处理点赞用户列表
            "likes": [{"id": user.id, "username": user.username} for user in self.likes.all()],
            "message": self.message,
            "date": self.date.strftime("%b %d %Y")
        }

2. 为视图添加异常处理

当前视图里用Post.objects.get(id=id),如果请求的帖子ID不存在,会直接抛出DoesNotExist异常导致500错误,建议添加捕获逻辑:

# views.py
from django.shortcuts import get_object_or_404
from django.http import JsonResponse

@csrf_exempt
def post(request,id):
    # 用get_object_or_404自动处理不存在的情况,返回404响应
    post = get_object_or_404(Post, id=id)
    if request.method == "GET":
        return JsonResponse({"post": post.serialize()})

3. 完善前端fetch的错误处理

当前前端代码没有处理HTTP错误状态码(比如500、404),建议补充:

// script.js
posts.forEach(post => {
    fetch(`post/${post.getAttribute('name')}`)
    .then(response => {
        if (!response.ok) {
            throw new Error(`HTTP error! status: ${response.status}`);
        }
        return response.json();
    })
    .then(data => {
        console.log(data)
    })
    .catch(error => {
        console.error('获取帖子数据失败:', error);
    })
})

这样修改后,不仅解决了JSON序列化的问题,还能更优雅地处理各种异常情况,避免出现无提示的500错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 12:32:55