使用 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)