【问题标题】:SearchFilter for multiple models -- Django多个模型的搜索过滤器——Django
【发布时间】:2021-07-19 05:01:04
【问题描述】:

将 Django 3.2 与 Restframework 结合使用。 我正在尝试搜索过滤器并使用 restframework 创建一个 API,它将输出搜索到的词及其整个对象。

official doc 在这方面取得了一些成功。但从此我只能在单个模型中搜索,而不是全局搜索。 我找到了一个blog,关于如何一起使用多个模型?

我试着从那开始:

Views.py

class GlobalSearchList(generics.ListAPIView):
    serializer_class = GlobalSearchSerializer

    def get_queryset(self):
      query = self.request.query_params.get('query', None)
      users = MasterUser.objects.filter(Q(firstname__icontains=query) | Q(lastname__icontains=query) | Q(email__icontains=query) | Q(category__icontains=query))
      webinar = MasterWebinar.objects.filter(Q(host__icontains=query) | Q(title__icontains=query))
      section = ResourceSection.objects.filter(Q(resource_name__icontains=query))
      item = SectionItem.objects.filter(Q(item_title__icontains=query))
      all_results = list(chain(users,webinar,section,item))
      serialize_obj = serializers.serialize('json',all_results)
      print(serialize_obj)    #Json response is printed in console
      return JsonResponse(json.loads(serialize_obj), safe=False)   #nothing as output

在这里,在打印输出时,它会打印一个 json 对象,但不会返回任何内容作为输出。没有输出的任何原因,我在哪里做错了?

序列化器.py

class GlobalSearchSerializer(serializers.Serialize):
    
    def to_native(self, obj):
        if isinstance(obj, MasterIndividualMembers): 
            serializer = MasterIndividualMembersSerializer(obj)
        elif isinstance(obj, MasterUser):
            serializer = MasterUserSerializer(obj)
         elif isinstance(obj, MasterWebinar):
             serializer = MasterWebinarSerializer(obj)
         elif isinstance(obj, MasterResource):
             serializer = MasterResourceSerializer(obj)
         elif isinstance(obj, ResourceSection):
             serializer = ResourceSectionSerializer(obj)
         elif isinstance(obj, SectionItem):
             serializer = SectionItemSerializer(obj)

        else:
            raise Exception("Not found in any instance!")
        return serializer.data

我也尝试使用serializers.ModelSerializer,但它只接受序列化程序中的 1 个模型。 请有任何建议!

编辑:在 Postman 中进行测试时,我收到以下输出:

端点:localhost:8000/search/?query=john

[
    {}, {}
]

预期结果:

[
    {
        "id": 1,
        "password": "somehashcode",
        "last_login": "2021-07-13T06:08:08.313605Z",
        "email": "abc@xyz.com",
        "date_of_birth": "2020-10-10",
        "is_active": true,
        "is_admin": true,
        "firstname": "John",
        "lastname": "Doe",
        "is_member": true,
        "date_joined": "2021-07-11",
        "last_signed_in": "2021-07-11T03:27:37Z",
        "is_subscription": true,
        "category": null,
        "contact": "1231321",
        "membership_id": "343cr234rcrr3rc"
    },
    ...
    ...
]

为了重现,控制台给出输出: [<MasterUser: abc@xyz.com>, <MasterUser: dummy2@xyz.com>]

因为名字有 John,所以整个 MasterUser 作为输出。

【问题讨论】:

  • 如果您的serialized_obj 是您想要的响应,您可能会使用类似的方式返回return Response(serialized_obj, status=200Response 来自from rest_framework.response import Response。这行得通吗?
  • 我试过它抛出错误为The response content must be rendered before it can be iterated over.
  • 是的,它给出了这个错误,因为方法 get_querset 应该返回 queryset 而不是响应。你为什么试图从这个方法返回一个serialized_obj
  • 嗯,我不太了解get_queryset,它是如何工作的。但由于all_results 仅给出模型对象的输出,我将它们序列化并尝试获取输出。有什么建议我该如何修改它,或者任何可以提供帮助的文档?
  • 你能把你得到的东西贴出来吗?另外,请添加您期望的内容?

标签: python django django-rest-framework


【解决方案1】:

最终我摆脱了class GlobalSearchList(generics.ListAPIView): 及其序列化程序。

只需将响应添加为 return HttpResponse(serialize_obj,content_type='application/json') 即可接收 json 响应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多