Serialize Django Model and return GET Response

Viewed 2061

I am trying to serialize the queryset objects I created when retrieving all jobs from my model.

Basically I want an endpoint that lists all jobs that are currently created in the database.

Anyone has permissions to view the jobs. However you need to be authenticated to POST, DELETE, or EDIT new jobs.

My problems is just making the jobs viewable at the endpoint i created using APIView. I was getting an error before that says the object is not in JSON format.

views.py

class RetrieveJobsView(APIView):
  """Retrieves all job postings"""
  serializer_class = serializers.JobSerializer
  
  def get(self, request, format=None):
    """ Return a list of all jobs"""
    queryset = Job.objects.all()
    queryset = serializers.JobSerializer(queryset)
    return Response(queryset)

serializers.py

class JobSerializer(serializers.ModelSerializer):
  """Serializer for tag objects"""

  class Meta:
    model = Job
    fields = ('id', 'description', 'job_type', 'city', 'state', 'salary', 'position', 'employer', 'created_date', 'is_active')
    read_only_fields = ('id',)

  def create(self, validated_data):
    """Create a job posting with user and return it"""
    user = self.context['request'].user
    print(self.context['request'])

    if not user:
      msg = _('Unable to POST job request. A valid user must be logged in.')
      raise serializers.NotAuthenticated(msg, code=None)
    
    validated_data[user] = user

    return validated_data

models.py

class Job(models.Model):
  """A Job used to create a job posting"""
  user = models.ForeignKey(
    settings.AUTH_USER_MODEL,
    on_delete=models.CASCADE,
  )
  description = models.TextField()
  job_type = models.CharField(max_length=12, choices=JOB_TYPE_CHOICES, default='Full-Time')
  city = models.CharField(max_length=255)
  state = models.CharField(max_length=255)
  created_date = models.DateField(auto_now=False, auto_now_add=True)
  salary = models.CharField(max_length=255)
  position = models.CharField(max_length=255)
  employer = models.CharField(max_length=255)
  is_active = models.BooleanField(default=True)

  def __str__(self):
    return self.description[:50]

urls.py

app_name = 'jobPosting'

urlpatterns = [
  path('all_jobs/', views.RetrieveJobsView.as_view(), name='job-list')
]

I know my error is in the views.py file because I am not sure how to properly return serialized data from an object.

2 Answers

In your RetrieveJobsView class. The get method return object instead of JSON data.

You must access the data from an object before return it:

def get(self, request, format=None):
    """ Return a list of all jobs"""
    queryset = Job.objects.all()
    serializer = serializers.JobSerializer(queryset, many=True)
    return Response(serializer.data)

This should solve the issue

queryset = serializers.JobSerializer(queryset, many=True)
return Response(queryset.data)

Here, you tell drf that queryset contains multiple items (a list of items) by setting many=True, so drf needs to serialize each item with serializer class (and serializer.data will be a list)

If this argument is not set, queryset implies that it is a single instance and serializer.data is a single entity.

Related