Search code examples
pythondjangodjango-rest-frameworkdjango-haystack

Django-haystack with rest-framework serializer gives result None


I'm trying to use django-haystack to include an elasticsearch based search in my application. I'm using django-rest-framework to build the API. Following is my index:

class ArtistIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, model_attr='name')

    def get_model(self):
        return Artist

This is my view:

def search(request):
    q = request.GET.get('q', '')
    if q is '':
        return Response(status=status.HTTP_400_BAD_REQUEST)
    all_results = SearchQuerySet().models(Artist).filter(content=Clean(q))
    serializer = ArtistSerializer(all_results, many=True)
    print serializer.data
    return Response(status=status.HTTP_200_OK)

And my serializer:

class ArtistSerializer(serializers.ModelSerializer):
    class Meta:
        model = Artist
        fields = (
            'name',
            'type',
            'gender',
            'begin_life',
            'end_life',
        )

However, when I hit the endpoint, the print statement prints something like this:

[{'name': None, 'type': None, 'gender': None, 'begin_life': None, 'end_life': None}, {'name': None, 'type': None, 'gender': None, 'begin_life': None, 'end_life': None}, {'name': None, 'type': None, 'gender': None, 'begin_life': None, 'end_life': None}, {'name': None, 'type': None, 'gender': None, 'begin_life': None, 'end_life': None}, {'name': None, 'type': None, 'gender': None, 'begin_life': None, 'end_life': None}]

Could someone please tell what am I doing wrong?

Thanks.


Solution

  • I found a better way to serialize the data. I am now using this:

    from django.core import serializers
    
    -- snippet --
    
    def search(request):
        q = request.GET.get('q', '')
        if q is '':
            return Response(status=status.HTTP_400_BAD_REQUEST)
        all_results = SearchQuerySet().filter(content=Clean(q))
        serializer = serializers.serialize("json", [q.object for q in all_results])
        print serializer
        return Response(status=status.HTTP_200_OK)
    

    Now, I am able to search in multiple models without worrying about serializing the data :)

    The result data is like this:

    {
        "fields": {
            "name": "Megadeth",
            "end_life": "",
            "gid": "a9044915-8be3-4c7e-b11f-9e2d2ea0a91e",
            "gender": "",
            "type": "2",
            "begin_life": "1983-6-"
        },
        "model": "InQusic.artist",
        "pk": 975773
    }
    

    so, now I can possibly differentiate results on my client.