DRF-аннотированная фильтрация запросов с помощью django-фильтра
Может кто-нибудь помочь с фильтрацией в DRF. У меня есть некоторые модели продуктов, скажем Product
и менеджер ProductManager
:
class ProductItem(Model):
price = DecimalField()
class Product(Model):
items = ManyToManyField(ProductItem)
priceman = ProductManager()
class ProductManager(Manager):
def get_queryset(self):
qs = super().get_queryset().annotate(total_price=Sum('items__price'))
return qs
Вот если класс фильтра:
class ProductFilter(django_filters.rest_framework.FilterSet):
class Meta:
model = Product
fields = {
'total_price': ['lt', 'gt'],
}
Вот точка зрения:
class ProductViewSet(ModelViewSet):
queryset = Product.priceman.all()
filterset_class = ProductFilter
и я получаю ошибку:
TypeError: 'Meta.fields' contains fields that are not defined on this FilterSet: total_price
Как мне настроить класс фильтра, чтобы это работало?
1 ответ
Я нашел ответ, это можно сделать, изменив класс фильтра следующим образом:
class ProductFilter(django_filters.rest_framework.FilterSet):
min_price = NumberFilter(field_name="total_price", lookup_expr='gt')
max_price = NumberFilter(field_name="total_price", lookup_expr='lt')
class Meta:
model = Product
fields = ['min_price', 'max_price']