Django / DRF: Сериализация QuerySet не приводит к ошибке "No attribute found error"

Когда я сериализую кверисет из нескольких элементов, он выбрасывает id not found error - несмотря на то, что каждый элемент имеет атрибут id (я уже проверил это).

Сериализация: json_data = SampleSerializer(Sample.objects.all(), many=True)

Serializer:

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"]),)

ViewSet

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

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'

Вы можете определить класс SampleAPIView в каталоге views?

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

Кроме того, если вы собираетесь получить его в формате json, я думаю, вам следует использовать

json.loads()

Вернуться на верх