'InnerDoc'对象没有属性'pk'

问题描述 投票:0回答:1

当我尝试将自定义序列化器与 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 引用。但错误仍然存在。

什么可能导致此问题?如何解决?任何见解或建议将不胜感激。

python django elasticsearch django-rest-framework
1个回答
0
投票

它肯定不漂亮,但是在序列化器上使用

to_representation
方法:

def to_representation(self, instance):
    return super().to_representation(instance.to_dict())

问题是,您序列化的对象必须是 DRF 可以理解的东西,而不是 InnerDoc

© www.soinside.com 2019 - 2024. All rights reserved.