首页 > 解决方案 > Django / DRF:序列化 QuerySet 导致没有“未找到属性错误”

问题描述

当我序列化一个多项目查询集时,它会抛出id not found error- 尽管每个项目都有一个id属性(我已经检查过这个)。

序列化:json_data = SampleSerializer(Sample.objects.all(), many=True)

序列化器:

class SampleSerializer(serializers.ModelSerializer):
    sample_id = serializers.SerializerMethodField()

    class Meta:
        model = Sample
        fields = ["sample_id",]

    def get_sample_id(self, obj):
        return encoded_id(obj.id)  # not found error

模型

class Sample(models.Model):
    objects = SampleManager()

    id = models.AutoField(primary_key=True)
    vector_column = SearchVectorField(null=True)

    class Meta:
        indexes = (GinIndex(fields=["vector_column"]),)

视图集

class SampleViewSet(viewsets.ViewSet):
    serializer_class = SampleSerializer

    @action(detail=False, methods=["POST"])
    def search_samples(self, request):
        samples = Link.objects.all()
        json_samples = SampleSerializer(samples, many=True).data
        return Response(json_links, status=status.HTTP_200_OK)

追溯

Traceback (most recent call last):
  File "venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 204, in _get_response
    response = response.render()
  File "venv/lib/python3.8/site-packages/django/template/response.py", line 105, in render
    self.content = self.rendered_content
  File "venv/lib/python3.8/site-packages/rest_framework/response.py", line 70, in rendered_content
    ret = renderer.render(self.data, accepted_media_type, context)
  File "venv/lib/python3.8/site-packages/rest_framework/renderers.py", line 724, in render
    context = self.get_context(data, accepted_media_type, renderer_context)
  File "venv/lib/python3.8/site-packages/rest_framework/renderers.py", line 696, in get_context
    'post_form': self.get_rendered_html_form(data, view, 'POST', request),
  File "venv/lib/python3.8/site-packages/rest_framework/renderers.py", line 511, in get_rendered_html_form
    return self.render_form_for_serializer(serializer)
  File "venv/lib/python3.8/site-packages/rest_framework/renderers.py", line 519, in render_form_for_serializer
    serializer.data,
  File "venv/lib/python3.8/site-packages/rest_framework/serializers.py", line 548, in data
    ret = super().data
  File "venv/lib/python3.8/site-packages/rest_framework/serializers.py", line 248, in data
    self._data = self.to_representation(self.validated_data)
  File "venv/lib/python3.8/site-packages/rest_framework/serializers.py", line 515, in to_representation
    ret[field.field_name] = field.to_representation(attribute)
  File "venv/lib/python3.8/site-packages/rest_framework/fields.py", line 1882, in to_representation
    return method(value)
  File "/serializers.py", line 22, in get_sample_id
    return encoded_id(obj.id)

Exception Type: AttributeError at /api/samples/search_samples/
Exception Value: 'collections.OrderedDict' object has no attribute 'id'

标签: djangodjango-rest-framework

解决方案


您可以在您的视图目录中定义 SampleAPIView 类吗?

class SampleAPIView(ListAPIView):
  permission_class = (IsAccessUser,)
  serializer_class = SampleSerializer
  queryset = Sample.object.all()

另外,如果您要将其获取为 json 格式,我认为您应该使用

json.loads()


推荐阅读