序列化 Django 模型并返回 GET 响应

Nic*_*ick 4 python django django-rest-framework

我试图序列化从模型中queryset检索所有对象时创建的对象。jobs

基本上我想要一个列出当前在数据库中创建的所有作业的端点。

任何人都有权查看职位。但是,您需要经过身份验证才能发布、删除或编辑新作业。

我的问题只是使作业在我使用创建的端点上可见APIView。之前我收到一个错误,指出该对象不是 JSON 格式。

视图.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)
Run Code Online (Sandbox Code Playgroud)

序列化器.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
Run Code Online (Sandbox Code Playgroud)

模型.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]
Run Code Online (Sandbox Code Playgroud)

urls.py

app_name = 'jobPosting'

urlpatterns = [
  path('all_jobs/', views.RetrieveJobsView.as_view(), name='job-list')
]
Run Code Online (Sandbox Code Playgroud)

我知道我的错误在views.py 文件中,因为我不确定如何正确从对象返回序列化数据。

小智 7

在你的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)
Run Code Online (Sandbox Code Playgroud)


Eht*_*dim 5

这应该可以解决问题

queryset = serializers.JobSerializer(queryset, many=True)
return Response(queryset.data)
Run Code Online (Sandbox Code Playgroud)

在这里,您通过设置many=True告诉drf queryset包含多个项目(项目列表),因此drf需要使用序列化器类序列化每个项目(并且serializer.data将是一个列表)

如果未设置此参数,则 queryset 意味着它是单个实例,并且 serializer.data 是单个实体。