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()