#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 — единый объект.