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)
这应该可以解决问题
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 是单个实体。
| 归档时间: |
|
| 查看次数: |
5133 次 |
| 最近记录: |