django - 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'
解决方案
您可以在您的视图目录中定义 SampleAPIView 类吗?
class SampleAPIView(ListAPIView):
permission_class = (IsAccessUser,)
serializer_class = SampleSerializer
queryset = Sample.object.all()
另外,如果您要将其获取为 json 格式,我认为您应该使用
json.loads()
推荐阅读
- json - Swift JSON字符串到字典无法解析所有值
- visual-studio-code - 使用 alt-arrow 移动代码块时如何停止 VS Code 奇怪的缩进
- node.js - 使用 react-scripts 指定项目路径
- c++ - 为承诺设置例外会导致中止调用
- macos - 在 macOS Catalina 中禁用 SIP 的只读文件系统
- python - 我无法使用 Django 发送电子邮件是什么?
- node.js - Puppeteer 页面请求仅在 AWS EC2 实例上失败
- javascript - mat-checkbox 无法正确显示选中的值
- react-native - 如何将 flexwrap 向左对齐?
- java - 如何在所有子项目中调用 Gradle 任务?