为字段设置源时无法访问序列化程序中的查询集对象 ID



使用 Django REST 框架,我有以下序列化程序:

class TagSelectOptionsSerializer(serializers.ModelSerializer):
    label = serializers.CharField(source='title')
    value = serializers.IntegerField(source='id')
    class Meta:
        model = Tag
        fields = ('value', 'label')
        read_only_fields = ('value', 'label', )

尝试在我的视图中使用它时(见下文(,出现以下错误:

'QuerySet' object has no attribute 'id'

谁能告诉我如何访问主键字段,就像我正在访问上述序列化程序中的标题字段一样?

class TagSelectOptions(APIView):
    """
    ...
    """
    def get(self, request):
        tags = Tag.objects.filter(approved=True)
        if len(tags) > 1:
            serializer = TagSelectOptionsSerializer(tags, many=True)
        else:
            serializer = TagSelectOptionsSerializer(tags)
        return Response(serializer.data, status=rest_status.HTTP_200_OK)

您的 get 方法不正确。

当结果的长度小于或等于 1 时,您仍应发送 many=True。

因为 API 的行为应该保持不变。JSON 方案将在所有情况下返回对象列表。

因此,将代码更改为:

def get(self, request):
    tags = Tag.objects.filter(approved=True)
    # handles all cases by default
    serializer = TagSelectOptionsSerializer(tags, many=True)
    return Response(serializer.data, status=rest_status.HTTP_200_OK)

但是,如果确实想在查询集仅返回单个结果时只返回单个对象,请使用:

def get(self, request):
    tags = Tag.objects.filter(approved=True)
    if len(tags) == 1:
        serializer = TagSelectOptionsSerializer(tags[0])
    else:
        # when len > 1 or len == 0
        serializer = TagSelectOptionsSerializer(tags, many=True)
    return Response(serializer.data, status=rest_status.HTTP_200_OK)

最新更新