正确的数据输入和保存后,串行器会导致KeyError

时间:2016-12-06 20:43:18

标签: django api django-rest-framework

我正在创建一个API端点,通过其API工作并保存数据。它有效,但我担心的是它会引发KeyError,如下所示。我不确定这是否是我的代码的问题。非常感谢您的帮助。

数据:

data = {'title': u'abc', 'career_level': 1}

串行:

class JobPostSerializer(serializers.ModelSerializer):
    career_level = PrimaryKeyRelatedField(allow_null=True, queryset=CareerLevel.objects.all(), required=False)
    title = CharField(allow_blank=True, allow_null=True, max_length=240, required=False)

型号:

class JobPost(models.Model):
    career_level = models.ForeignKey(CareerLevel, related_name='jobpost_career', blank=True, null=True)
    title = models.CharField(max_length=240, blank=True, null=True)
    created_at = models.DateTimeField(db_index=True, auto_now_add=True)

    def __str__(self):
        return self.title

    def __unicode__(self):
        return self.title

    class Meta:
        ordering = ['-created_at']

错误讯息:

Internal Server Error: /api/v1/posts/
Traceback (most recent call last):
  File "/home/ubuntu/panbecopy/src/penv/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 149, in get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/ubuntu/panbecopy/src/penv/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 147, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/ubuntu/panbecopy/src/penv/local/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/ubuntu/panbecopy/src/penv/local/lib/python2.7/site-packages/rest_framework/viewsets.py", line 87, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/ubuntu/panbecopy/src/penv/local/lib/python2.7/site-packages/rest_framework/views.py", line 466, in dispatch
    response = self.handle_exception(exc)
  File "/home/ubuntu/panbecopy/src/penv/local/lib/python2.7/site-packages/rest_framework/views.py", line 463, in dispatch
    response = handler(request, *args, **kwargs)
  File "/home/ubuntu/panbecopy/src/penv/local/lib/python2.7/site-packages/rest_framework/mixins.py", line 22, in create
    headers = self.get_success_headers(serializer.data)
  File "/home/ubuntu/panbecopy/src/penv/local/lib/python2.7/site-packages/rest_framework/serializers.py", line 503, in data
    ret = super(Serializer, self).data
  File "/home/ubuntu/panbecopy/src/penv/local/lib/python2.7/site-packages/rest_framework/serializers.py", line 241, in data
    self._data = self.to_representation(self.validated_data)
  File "/home/ubuntu/panbecopy/src/penv/local/lib/python2.7/site-packages/rest_framework/serializers.py", line 463, in to_representation
    attribute = field.get_attribute(instance)
  File "/home/ubuntu/panbecopy/src/penv/local/lib/python2.7/site-packages/rest_framework/relations.py", line 157, in get_attribute
    return get_attribute(instance, self.source_attrs)
  File "/home/ubuntu/panbecopy/src/penv/local/lib/python2.7/site-packages/rest_framework/fields.py", line 78, in get_attribute
    instance = instance[attr]
KeyError: u'career_level'

1 个答案:

答案 0 :(得分:0)

您的序列化程序定义毫无意义。

JobPostSerializer(data={'title': u'abc', 'career_level': 1}):

应该是:

class JobPostSerializer(serializers.ModelSerializer):

您的那一行与您想要实例化序列化程序时更相似。例如,当您想要检查输入是否有效时。

job_serializer = JobPostSerializer(data={'title': u'abc', 'career_level': 1})
job_serializer.is_valid()