在django rest框架中对搜索结果进行排序

sorting search result in django rest framework

我在 django rest 框架中为我的网站编写了一个搜索 api。 当您搜索一个名字(例如“jumanji”)时,由于多种原因,搜索结果可能不止一个。我想要的是按 Film 模型的“rating”字段或“releaseDate”字段对结果进行排序。

这是我的代码。

# models.py
class Film(models.Model):
    filmID = models.AutoField(primary_key=True)
    title = models.CharField(max_length=150)
    duration = models.PositiveIntegerField()
    typeOf = models.IntegerField(validators=[MaxValueValidator(3), MinValueValidator(1),])
    rating = models.FloatField(default=0, validators=[MaxValueValidator(10), MinValueValidator(0),])
    releaseDate = models.DateTimeField(null=True)
# serializers.py

class FilmSerializer(serializers.ModelSerializer):
    class Meta:
        model = Film
        fields = [
            "filmID", "title", "price", "duration", "typeOf", "numberOfFilminoRatings", "filminoRating", "rating",
            "releaseDate", "detailsEn", "salePercentage", "saleExpiration", "posterURL", "posterDirectory",
        ]
# views.py
'''Override get_search_fields method of SearchFilter'''
class DynamicSearch(filters.SearchFilter,):
    def get_search_fields(self,view, request):
        return request.GET.getlist('search_fields',[])

'''Override page_size_query_param attribute of PageNumberPagination'''
class CustomizePagination(PageNumberPagination):
    page_size_query_param = 'limit'


"""Pagination Handler"""
class PaginationHanlerMixin(object):
    @property
    def paginator(self):
        if not hasattr(self, '_paginator'):
            if self.pagination_class is  None:
                 self._paginator =None
            else :
                self._paginator = self.pagination_class()
        else :
            pass

        return self._paginator

    def  paginate_queryset(self,queryset):
        if self.paginator is None:
            return None
        
        return self.paginator.paginate_queryset(queryset, self.request, view=self)

    def get_paginated_response(self,data):
        if self.paginator is None:
            raise "Paginator is None"
        return self.paginator.get_paginated_response(data)



class SearchFilm(APIView,PaginationHanlerMixin):
    authentication_classes = ()
    permission_classes = (AllowAny,)
    def __init__(self,):
        APIView.__init__(self)
        self.search_class=DynamicSearch
        self.pagination_class=CustomizePagination

    def filter_queryset(self,queryset):
      filterd_queryset=self.search_class().filter_queryset(self.request, queryset ,self)
      return filterd_queryset


    def get(self, request):
        films= Film.objects.all()
        filtered_queryset=self.filter_queryset(films)
        #Get appropriate results for each page
        results=self.paginate_queryset(filtered_queryset)
        if(results is not None):
            serializer=FilmSerializer(results,many=True)
            serializer=self.get_paginated_response(serializer.data)
        else :
            serializer=FilmSerializer(filtered_queryset,many=True)

        return Response(serializer.data, status=status.HTTP_200_OK)

它就像使用功能 order_byQuerySet 电影一样简单。如果你给的选项很少,它会首先从最左边排序,然后从第二到左边等等

films = Film.objects.all().order_by('rating', 'releaseDate')