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']
Другие вопросы по тегам