Using Django 3.2 with Restframework. I’m trying for search filter and create a API with restframework which would output the searched term with its whole object.
I had a little success on that with official doc. But from that I can only search in a single Model and not as globally. I found a blog on how to use multiple Models together?
I tried for following from that:
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
In here, while printing the output it does print a json object, but doesn’t return anything as output. Any cause why there is no output, where am I doing wrong?
serializers.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
Also I tried with serializers.ModelSerializer
but it will only accept 1 model in serializer.
Any suggestions please!
Edit: On testing in Postman I received following output:
Endpoint: localhost:8000/search/?query=john
[
{}, {}
]
Expected outcome:
[
{
"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"
},
]
To reproduce, console gives output:
[<MasterUser: abc@xyz.com>, <MasterUser: dummy2@xyz.com>]
As the firstname has John the whole MasterUser
came as output.
Advertisement
Answer
Eventually I get rid of class GlobalSearchList(generics.ListAPIView):
and also its serializers.
and just add response as return HttpResponse(serialize_obj,content_type='application/json')
to receive json response.