Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Serialize Django Model and return GET Response

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.

like image 464
Nick Avatar asked Oct 16 '25 01:10

Nick


1 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)
like image 187
King Peanut Avatar answered Oct 17 '25 14:10

King Peanut



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!