我正在尝试覆盖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)