[Django]-Filtering avg sum via OrderingFilter

2👍

you can add fields to your filterset like this :

import django_filters

class ProductFilter(FilterSet):
    profit = django_filters.CharFilter(method='profit_filter', label='profit')

    class Meta:
        model = Product
        fields = [
            'profit'
            ]

    def profit(self, queryset, name, value):
        return queryset.annotate().filter()

0👍

You can annotate the QuerySet with profit using F expressions and simply add it to your filter.

An example:

views.py

from rest_framework.viewsets import ModelViewSet

from django.db.models import F
from myapp.models import Product
from myapp.filters import ProductFilter
from myapp.serializers import ProductSerializer

from django_filters import rest_framework as filters


class ProductViewSet(ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    filter_backends = [filters.DjangoFilterBackend]
    filterset_class = ProductFilter

    def get_queryset(self):
        qs = ( 
            super()
            .get_queryset()
            .annotate(profit=
                      F('productinfo__price') -
                      F('productinfo__cost_price') - 
                      F('productinfo__vat')
            )
        )
        return qs

filters.py

from .models import Product
from django_filters import OrderingFilter
from django_filters.rest_framework import FilterSet


class ProductFilter(FilterSet):
    order_by_field = "ordering"
    ordering = OrderingFilter(
        fields=(
            ("name", "name"),
            ("profit", "profit"),
            ("productinfo__price", "price"),
            ("productinfo__barcode", "barcode")
        )
    )

    class Meta:
        model = Product
        fields = '__all__'
👤Niko

Leave a comment