领域

2016-05-23 195 views
1

我具有以下结构:领域

模型

class Customer(models.Model): 
    name = models.ForeignKey(Candidate) 
    candidate_test = models.ForeignKey(CandidateTest, null=True) 
    # Other fields 

class Candidate(models.Model): 
    first_name = models.CharField(max_length=40) 
    # Other fields 

class CandidateTest(models.Model): 
    test_id = models.ForeignKey(Test) 
    # 2 more fields with Foreign Key and null, blank both are True 

class Test(models.Model): 
    test_name = models.CharField() 
    # 2 more fields with Foreign Key and null, blank both are True 

串行器

class CandidateSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Candidate 
     fields = ('first_name', # other fields) 


class TestSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Test 
     fields = ('id', 'test_name',) 


class CandidateTestSerializer(serializers.ModelSerializer): 
    test_id = TestSerializer() 

    class Meta: 
     model = CandidateTest 
     fields = ('id', 'test_id') 


class CustomerSerializer(serializers.ModelSerializer): 
    name = CandidateSerializer() 
    candidate_test = CandidateTestSerializer() 

    class Meta: 
     model = Customer 
     fields = ('id', 'name', 'candidate_test') 

现在使用Django当我提交(POST)形式Rest框架的可浏览的API我得到以下错误:

'list' object has no attribute 'get' 

以下是堆栈跟踪:

Error during template rendering 

In template /srv/www/safe/shared/env/local/lib/python2.7/site-packages /rest_framework/templates/rest_framework/horizontal/fieldset.html, error at line 11 
'list' object has no attribute 'get' 
1 {% load rest_framework %} 
2 <fieldset> 
3  {% if field.label %} 
4  <div class="form-group" style="border-bottom: 1px solid #e5e5e5"> 
5   <legend class="control-label col-sm-2 {% if style.hide_label %}sr-only{% endif %}" style="border-bottom: 0"> 
6   {{ field.label }} 
7   </legend> 
8  </div> 
9  {% endif %} 
10 
11 

    {% for nested_field in field %} 



12  {% if not nested_field.read_only %} 
13  {% render_field nested_field style=style %} 
14  {% endif %} 
15 {% endfor %} 
16 </fieldset> 
17 
Traceback Switch to copy-and-paste view 

/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/core/handlers/base.py in get_response 

           response = response.render() 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/response.py in render 

          self.content = self.rendered_content 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/rest_framework/response.py in rendered_content 

         ret = renderer.render(self.data, media_type, context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/rest_framework/renderers.py in render 

         context = self.get_context(data, accepted_media_type, renderer_context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/rest_framework/renderers.py in get_context 

          'post_form': self.get_rendered_html_form(data, view, 'POST', request), 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/rest_framework/renderers.py in get_rendered_html_form 

            [('template', 'rest_framework/api_form.html')] 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/rest_framework/renderers.py in render 

         return template.render(context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/backends/django.py in render 

         return self.template.render(context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/base.py in render 

            return self._render(context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/base.py in _render 

         return self.nodelist.render(context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/base.py in render 

           bit = self.render_node(node, context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/debug.py in render_node 

          return node.render(context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/defaulttags.py in render 

              nodelist.append(node.render(context)) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/defaulttags.py in render 

           return nodelist.render(context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/base.py in render 

           bit = self.render_node(node, context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/debug.py in render_node 

          return node.render(context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/base.py in render 

            return func(*resolved_args, **resolved_kwargs) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/rest_framework/templatetags/rest_framework.py in render_field 

        return renderer.render_field(field, style) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/rest_framework/renderers.py in render_field 

         return template.render(context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/backends/django.py in render 

         return self.template.render(context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/base.py in render 

            return self._render(context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/base.py in _render 

         return self.nodelist.render(context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/base.py in render 

           bit = self.render_node(node, context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/debug.py in render_node 

          return node.render(context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/defaulttags.py in render 

              nodelist.append(node.render(context)) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/defaulttags.py in render 

           return nodelist.render(context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/base.py in render 

           bit = self.render_node(node, context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/debug.py in render_node 

          return node.render(context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/base.py in render 

            return func(*resolved_args, **resolved_kwargs) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/rest_framework/templatetags/rest_framework.py in render_field 

        return renderer.render_field(field, style) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/rest_framework/renderers.py in render_field 

         return template.render(context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/backends/django.py in render 

         return self.template.render(context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/base.py in render 

            return self._render(context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/base.py in _render 

         return self.nodelist.render(context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/base.py in render 

           bit = self.render_node(node, context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/debug.py in render_node 

          return node.render(context) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/django/template/defaulttags.py in render 

           values = list(values) 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/rest_framework/utils/serializer_helpers.py in __iter__ 

          yield self[field.field_name] 

    ... 
▶ Local vars 
/srv/www/safe/shared/env/local/lib/python2.7/site-packages/rest_framework/utils/serializer_helpers.py in __getitem__ 

         error = self.errors.get(key) if self.errors else None 

    ... 
▼ Local vars 
Variable Value 
field 

IntegerField(label='ID', read_only=True) 

self  

<NestedBoundField value={} errors=[u'This field is required.']> 

key  

'id' 

value 

None 

还要注意的是使用请求其工作正常...

回答

0

您的CustomerSerializer串行一个错字:

candidate_test = CustomerSerializer() 

应可能是:

candidate_test = CandidateTestSerializer() 
+0

谢谢,但它是在键入它在这里,它不是实际的问题。 –

0

这是REST框架中的错误,并且现在还没有固定的: https://github.com/tomchristie/django-rest-framework/issues/4073

为了解决这个问题,我想通了,到目前为止,唯一的办法是这样的:

ModelSerializer或继承了你的类

Serializer,覆盖__getitem__方法:

def __getitem__(self, key): 
    field = self.fields[key] 
    value = self.data.get(key) 
    error = self.errors.get(key) if hasattr(self, '_errors') else None 
    if isinstance(field, serializers.Serializer): 
     return NestedBoundField(field, value, field.data) 
    return BoundField(field, value, error) 

这将向下传递field.data而不是错误,可能会引起一些其他问题,但到目前为止,它比传承误差列表更好(NE sted序列化程序期望错误树被完全填充,但它会接收父错误信息)