Django Rest 框架 - 使用 many=True 发布多个对象引发 AttributeError 'list'对象没有属性'get'



我正在尝试覆盖ListCreateAPIView的创建方法,以便能够同时发布多个对象。项目已正确保存,但我不断收到错误。

我正在使用 Django 1.10.4 和 DRF 3.5.3

models.py :

class Genre(models.Model):
     name = models.CharField(max_length=255, null=False, blank=False)
     category = models.ForeignKey(GenreCategory, related_name='genres', blank=True, null=True)
     active = models.BooleanField(default=False)

views.py :

class GenreList(generics.ListCreateAPIView):
    queryset = Genre.objects.all()
    serializer_class = GenreInputSerializer
    def list(self, request):
        queryset = self.get_queryset()
        serializer = GenreOutputSerializer(queryset, many=True, context={'request': request})
        return Response(serializer.data)
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data, many=True)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

serializers.py :

class GenreInputSerializer(serializers.ModelSerializer):
    class Meta:
        model = Genre
        fields = ('name', 'category',)

POST 请求数据(通过可浏览的 API):

[
    {
        "name": "Reggae",
        "category": null
    },
    {
        "name": "Blues",
        "category": null
    }
]

这是回溯:

Traceback (most recent call last):
  File "/Users/malastas/Documents/museekenv/lib/python3.4/site-packages/django/core/handlers/exception.py", line 39, in inner
response = get_response(request)
  File "/Users/malastas/Documents/museekenv/lib/python3.4/site-packages/django/core/handlers/base.py", line 217, in _get_response
response = self.process_exception_by_middleware(e, request)
  File "/Users/malastas/Documents/museekenv/lib/python3.4/site-packages/django/core/handlers/base.py", line 215, in _get_response
response = response.render()
  File "/Users/malastas/Documents/museekenv/lib/python3.4/site-packages/django/template/response.py", line 109, in render
self.content = self.rendered_content
  File "/Users/malastas/Documents/museekenv/lib/python3.4/site-packages/rest_framework/response.py", line 72, in rendered_content
ret = renderer.render(self.data, accepted_media_type, context)
  File "/Users/malastas/Documents/museekenv/lib/python3.4/site-packages/rest_framework/renderers.py", line 701, in render
context = self.get_context(data, accepted_media_type, renderer_context)
  File "/Users/malastas/Documents/museekenv/lib/python3.4/site-packages/rest_framework/renderers.py", line 674, in get_context
'post_form': self.get_rendered_html_form(data, view, 'POST', request),
  File "/Users/malastas/Documents/museekenv/lib/python3.4/site-packages/rest_framework/renderers.py", line 507, in get_rendered_html_form
return self.render_form_for_serializer(serializer)
  File "/Users/malastas/Documents/museekenv/lib/python3.4/site-packages/rest_framework/renderers.py", line 515, in render_form_for_serializer
serializer.data,
  File "/Users/malastas/Documents/museekenv/lib/python3.4/site-packages/rest_framework/serializers.py", line 527, in data
ret = super(Serializer, self).data
  File "/Users/malastas/Documents/museekenv/lib/python3.4/site-packages/rest_framework/serializers.py", line 266, in data
self._data = self.get_initial()
  File "/Users/malastas/Documents/museekenv/lib/python3.4/site-packages/rest_framework/serializers.py", line 399, in get_initial
for field_name, field in self.fields.items()
  File "/Users/malastas/Documents/museekenv/lib/python3.4/site-packages/rest_framework/serializers.py", line 400, in <listcomp>
if (field.get_value(self.initial_data) is not empty) and
  File "/Users/malastas/Documents/museekenv/lib/python3.4/site-packages/rest_framework/fields.py", line 435, in get_value
return dictionary.get(self.field_name, empty)
AttributeError: 'list' object has no attribute 'get'

对象已正确保存,但在访问 serializer.data 时,在响应期间引发错误

我已经看到很多发布只有 many=True 的多个对象的例子,所以我不明白为什么这会引发错误,你知道吗?

我敢打赌,错误是因为 BrowsableAPI 尝试显示与它从响应中获得的序列化程序匹配的表单,但由于它不需要列表而失败。

您应该尝试以纯 JSON 的形式执行请求,它应该可以工作。请注意,尽管正确的响应失败,但应创建您的内容。

嗨,

在您的定义列表中尝试一下:

def list(self, request):
    queryset = self.get_queryset()
    serializer = GenreOutputSerializer(queryset, many=True,safe=False, context={'request': request})
    return Response(serializer.data)

最新更新