当我尝试将自定义序列化器与 Django REST 框架结合使用时,我遇到了 Elasticsearch-dsl 的问题。我收到的错误消息是:
'InnerDoc' object has no attribute 'pk'
此错误源自我的 PaginatoredElasticSearchAPIView 中以下代码片段中的
serializer = self.serializer_class(results, many=True)
行:
class PaginatedElasticSearchAPIView(APIView, LimitOffsetPagination):
serializer_class = None
document_class = None
@abc.abstractmethod
def generate_q_expression(self, query):
"""This method should be overridden
and return a Q() expression."""
def get(self, request, query):
try:
q = self.generate_q_expression(query)
search = self.document_class.search().query(q)
response = search.execute()
print(f'Found {response.hits.total.value} hit(s) for query: "{query}"')
results = self.paginate_queryset(response, request, view=self)
serializer = self.serializer_class(results, many=True)
return self.get_paginated_response(serializer.data)
except Exception as e:
return HttpResponse(e, status=500)
我检查了我的序列化器,它似乎正确定义了主键(“id”):
class OfficeSerializer(serializers.ModelSerializer):
# ...
class Meta:
model = Office
fields = [
"id",
# ...
]
我的 Elasticsearch 文档(定义为 OfficeDocument)似乎也正确定义了主键(“id”):
@registry.register_document
class OfficeDocument(Document):
# ...
class Django:
model = Office
fields = [
"id",
# ...
]
尽管如此,我仍然遇到“'InnerDoc'对象没有属性'pk'”错误。
然后我重新创建了所有模型,而没有显式设置 ids,并删除了序列化器和文档文件中的 ids 引用。但错误仍然存在。
什么可能导致此问题?如何解决?任何见解或建议将不胜感激。
它肯定不漂亮,但是在序列化器上使用
to_representation
方法:
def to_representation(self, instance):
return super().to_representation(instance.to_dict())
问题是,您序列化的对象必须是 DRF 可以理解的东西,而不是 InnerDoc。