Сериализует модель Django и возвращает полученный ответ

#python #django #django-rest-framework

#python #django #django-rest-framework

Вопрос:

Я пытаюсь сериализовать queryset объекты, которые я создал при извлечении всех jobs из моей модели.

По сути, мне нужна конечная точка, в которой перечислены все задания, которые в данный момент создаются в базе данных.

У любого есть права на просмотр заданий. Однако для ПУБЛИКАЦИИ, УДАЛЕНИЯ или РЕДАКТИРОВАНИЯ новых заданий вам необходимо пройти проверку подлинности.

Мои проблемы просто делают задания доступными для просмотра в конечной точке, которую я создал с помощью APIView . До этого я получал сообщение об ошибке, в котором говорилось, что объект не в формате JSON.

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')
]
 

Я знаю, что моя ошибка в views.py файл, потому что я не уверен, как правильно возвращать сериализованные данные из объекта.

Ответ №1:

В вашем RetrieveJobsView классе. Метод get возвращает объект вместо данных JSON.

Вы должны получить доступ к данным из объекта, прежде чем возвращать их:

 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)
 

Ответ №2:

Это должно решить проблему

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

Здесь вы сообщаете drf, что набор запросов содержит несколько элементов (список элементов), задав значение many=True , поэтому drf необходимо сериализовать каждый элемент с помощью класса serializer (и serializer.data будет списком)

Если этот аргумент не задан, queryset подразумевает, что это один экземпляр, а serializer.data — единый объект.