DRF, «обязательно»: «Это поле обязательно для заполнения». - PullRequest
0 голосов
/ 15 января 2019

Я не могу получить правильный ответ, всегда получаю эту ошибку

{"required": "This field is required.", "null": "This field may not be null.", "not_a_list": "Expected a list of items but got type \"{input_type}\".", "empty": "This list may not be empty."}

Вот код (модели, сериализаторы, просмотры)

модель

class Task(models.Model):
    name = models.CharField(max_length=50)
    description = models.CharField(max_length=500, blank=True, default='')
    pub_datetime = models.DateTimeField()
    priority = models.CharField(choices=PRIORITY_CHOICES, max_length=1)
    status = models.BooleanField(default=False)
    owner = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    agenda = models.ForeignKey(Agenda, on_delete=models.CASCADE, blank=True, default=None, null=True)

    def __str__(self):
        return self.name

сериализаторов

class TaskSerializer(serializers.ModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')
    agenda = serializers.ReadOnlyField(source='agenda.name')

    class Meta:
        model = Task
        fields = ('id', 'name', 'description', 'pub_datetime', 'priority', 'status', 'owner', 'agenda')

вид

class TaskListView(generics.ListCreateAPIView):
    serializer_class = TaskSerializer
    permission_classes = (permissions.IsAuthenticated,)
    renderer_classes = [JSONRenderer, TemplateHTMLRenderer]
    template_name = 'task_list.html'

    def get(self, request, *args, **kwargs):
        queryset = Task.objects.filter(owner=self.request.user)
        if self.request.accepted_renderer.format == 'html':
            return Response({'tasks': queryset})
        else:
            serializer = TaskSerializer(data=queryset, many=True)
            if serializer.is_valid():
                return JsonResponse(serializer.data, safe=False)
            else:
                return JsonResponse(serializer.error_messages)

    def post(self, request, *args, **kwargs):
        name = request.data['name']
        description = request.data['description']
        priority = request.data['priority']
        new_task = Task.objects.create(name=name, description=description, pub_datetime=datetime.datetime.now(),
                                       priority=priority, status=False, owner=self.request.user)
        new_task.save()
        return redirect('task-list')

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

Я не уверен, в каком месте я ошибаюсь. Может кто-нибудь помочь?

просто текст, чтобы избежать ошибок

1 Ответ

0 голосов
/ 15 января 2019

Набор запросов или экземпляр объекта должны быть переданы в сериализатор как instance, а не data, поэтому:

queryset = Task.objects.filter(owner=self.request.user)
serializer = TaskSerializer(instance=queryset, many=True)

Кроме того, я считаю, что сериализатор не может проверить экземпляр, поэтому в этом случае вы сможете просто вернуть return JsonResponse(serializer.data)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...