Search code examples
pythondjangodjango-rest-frameworkdjango-filters

Custom OrderingFilter Django REST + Vue


I'm working on backend part of project (Django REST). I have a task - to do sorting for the front (Vue). The frontend sends a key for sorting and a parameter for sorting.

Example:

GET /api/v1/stocks/?sort_key=FBS&sort_type=ascending
GET /api/v1/stocks/?sort_key=FBS&sort_type=descending

I guess it can be done with OrderingFilter and DjangoFilterBackend. Any suggestions will be helpful.

my models.py

class Stock(models.Model):
    class Meta:
        verbose_name_plural = "Stocks"
        verbose_name = "Stock"
        ordering = ("-present_fbs",)

    store = models.ForeignKey(Store, on_delete=models.CASCADE, null=True, verbose_name="Store")
    fbs = models.PositiveIntegerField(default=0, verbose_name="FBS")

my views.py

class StocksApi(ListModelMixin, GenericViewSet):
    serializer_class = StocksSerializer
    permission_classes = (IsAuthenticated,)
    pagination_class = StocksDefaultPagination

    def get_queryset(self):
        return Stock.objects.filter(store__user_id=self.request.user.pk).order_by("-fbs")

Solution

  • You can get the sort parameters in get_queryset with self.request.query_params.get and then sort queryset as needed.

        def get_queryset(self):
            queryset = Stock.objects.filter(store__user_id=self.request.user.pk)
            sort_key = self.request.query_params.get('sort_key', None)
            sort_type = self.request.query_params.get('sort_type', None)
            if sort_key:
                if sort_type == 'ascending':
                    queryset = queryset.order_by(sort_key)
                elif sort_type == 'descending':
                    queryset = queryset.order_by('-' + sort_key)
            return queryset