在Django Rest Framework中序列化查询集
我正在尝试把一组对象转换成可以存储或传输的格式。我定义了一个视图方法:
@csrf_exempt
def venue_list(request, user_id):
"""
Check that the user is requesting his own venues.
"""
profile = get_profile_for_user_if_match(request.user, user_id)
if profile is None:
return HttpResponse(status=status.HTTP_401_UNAUTHORIZED)
venues = profile.venue_set.all()
serializer = VenueSerializer(venues)
return JSONResponse(serializer.data)
这个方法接收一个 user_id
参数,用来判断用户是否有权限访问这些数据,然后它会获取要返回的对象集合,但现在它不工作。
问题在于,它试图直接对这个集合进行转换,而不是对里面的每个对象进行转换,因此出现了这个错误信息:
Traceback:
File "/Users/mariopersonal/Documents/dev/offers/project/offers/venv/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
111. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/mariopersonal/Documents/dev/offers/project/offers/venv/lib/python2.7/site-packages/django/views/decorators/csrf.py" in wrapped_view
57. return view_func(*args, **kwargs)
File "/Users/mariopersonal/Documents/dev/offers/project/offers/wsgi/openshift/business/restful/views/venueViews.py" in venue_list
22. return JSONResponse(serializer.data)
File "/Users/mariopersonal/Documents/dev/offers/project/offers/venv/lib/python2.7/site-packages/rest_framework/serializers.py" in data
572. self._data = self.to_native(obj)
File "/Users/mariopersonal/Documents/dev/offers/project/offers/venv/lib/python2.7/site-packages/rest_framework/serializers.py" in to_native
351. value = field.field_to_native(obj, field_name)
File "/Users/mariopersonal/Documents/dev/offers/project/offers/venv/lib/python2.7/site-packages/rest_framework/fields.py" in field_to_native
336. return super(WritableField, self).field_to_native(obj, field_name)
File "/Users/mariopersonal/Documents/dev/offers/project/offers/venv/lib/python2.7/site-packages/rest_framework/fields.py" in field_to_native
207. value = get_component(value, component)
File "/Users/mariopersonal/Documents/dev/offers/project/offers/venv/lib/python2.7/site-packages/rest_framework/fields.py" in get_component
58. val = getattr(obj, attr_name)
Exception Type: AttributeError at /business/api/venues/1
Exception Value: 'QuerySet' object has no attribute 'name'
我该怎么做才能正确处理这个问题呢?
谢谢。
1 个回答
117
如果你想把一组对象或者查询集转换成可以存储或传输的格式,而不是单个对象,你需要在创建序列化器的时候加上 many=True
这个参数。所以在你的情况下,可以试试这样做:
...
venues = profile.venue_set.all()
serializer = VenueSerializer(venues, many=True)
...