DRF,“必填”:“此字段为必填。”

时间:2019-01-15 12:09:03

标签: python django python-3.x django-rest-framework

我无法获得有效的答复,总是会收到此错误

{"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 :(得分:4)

查询集或对象实例应以instance而不是data的形式传递给序列化程序,因此:

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

此外,我相信序列化程序无法验证实例,因此在这种情况下,您应该只可以返回return JsonResponse(serializer.data)