【发布时间】: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=200,Response来自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