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
相关产品推荐
相关产品推荐

