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

Django REST Framework v.2教程出现KeyError错误求助

解决DRF v2代码高亮API中的KeyError问题

嘿,我当年啃DRF v2教程的时候也踩过类似的KeyError坑,给你梳理几个大概率的问题点和解决办法:

1. 序列化器引用了不存在的字段/方法

DRF v2里实现代码高亮通常会在序列化器里加一个highlight字段,关联模型的自定义方法。如果这个方法没在模型里定义,或者source参数写错了,就会触发KeyError。

比如你可能写了这样的序列化器,但模型里没对应方法:

# serializers.py
from rest_framework import serializers
from snippets.models import Snippet

class SnippetSerializer(serializers.ModelSerializer):
    highlight = serializers.Field(source='get_highlight')  # 这里的get_highlight必须存在于模型中

    class Meta:
        model = Snippet
        fields = ('id', 'title', 'code', 'linenos', 'language', 'highlight')

修复办法:在Snippet模型里补全get_highlight方法,同时把没写完的language字段补全(通常还要加style字段):

# models.py
from django.db import models
from pygments.lexers import get_lexer_by_name
from pygments.formatters.html import HtmlFormatter
from pygments import highlight

class Snippet(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=100, blank=True, default='')
    code = models.TextField()
    linenos = models.BooleanField(default=False)
    language = models.CharField(max_length=100, default='python')  # 补全字段定义
    style = models.CharField(max_length=100, default='friendly')  # 高亮样式字段

    def get_highlight(self):
        # 调用Pygments生成高亮HTML
        lexer = get_lexer_by_name(self.language)
        formatter = HtmlFormatter(linenos=self.linenos, style=self.style, full=True)
        return highlight(self.code, lexer, formatter)

2. 视图中访问了序列化器数据里不存在的键

如果你的视图代码里直接取serializer.data['某个键'],但这个键不在序列化器的fields列表里,也会抛出KeyError。比如你在高亮视图里尝试获取highlight,但序列化器没把它加入返回字段。

排查技巧:先打印serializer.data看看实际返回的键有哪些,确保你访问的键确实存在。

3. 模型字段定义不完整

你提供的模型代码里language字段没写完(language = models...),如果这个字段没正确定义(比如缺了字段类型、参数),后续序列化或查询时也可能间接引发KeyError(比如DRF内部处理字段映射时找不到对应键)。一定要补全所有模型字段的定义。

最后,KeyError的核心是访问了不存在的字典键,你可以看报错的堆栈信息,定位到具体是哪一行代码、哪个键出了问题,这样能更快锁定问题~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:24:20