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
Source:stackexchange.com