Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Serialize queryset in Django rest framework

I am trying to serialize a collection of objects. I have define the following view method:

@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) 

It receives a user_id parameter which is used to determine if the user has permissions to access the data, then it gets the set of objects to be returned, but it doesn't work.

It is trying to serialize the set directly, instead of the object inside it, so its throwing this traceback:

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' 

How can I make this properly?

Thanks.

like image 505
mario595 Avatar asked Oct 23 '14 18:10

mario595


People also ask

How do you serialize a QuerySet in DRF?

To serialize a queryset or list of objects instead of a single object instance, you should pass the many=True flag when instantiating the serializer. So in your case try this: ... venues = profile.

How do you serialize an object in Django REST framework?

Creating and Using Serializers To create a basic serializer one needs to import serializers class from rest_framework and define fields for a serializer just like creating a form or model in Django.

What is serialization in Django REST framework?

Serializers allow complex data such as querysets and model instances to be converted to native Python datatypes that can then be easily rendered into JSON , XML or other content types.

Is serialization necessary in Django?

It is not necessary to use a serializer. You can do what you would like to achieve in a view. However, serializers help you a lot. If you don't want to use serializer, you can inherit APIView at a function-based-view.


Video Answer


1 Answers

To serialize a queryset or list of objects instead of a single object instance, you should pass the many=True flag when instantiating the serializer. So in your case try this:

... venues = profile.venue_set.all() serializer = VenueSerializer(venues, many=True) ... 
like image 180
Alex Lisovoy Avatar answered Sep 18 '22 04:09

Alex Lisovoy