【问题标题】:DRF annotated queryset filtering with django-filter使用 django-filter 进行 DRF 注释查询集过滤
【发布时间】:2019-04-03 10:30:57
【问题描述】:

任何人都可以帮助在 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

这里 if 过滤器类:

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

我应该如何配置过滤器类以使其工作?

【问题讨论】:

    标签: django django-rest-framework django-filter django-annotate


    【解决方案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']
    

    【讨论】:

      猜你喜欢
      • 2019-12-30
      • 2011-03-31
      • 2019-02-06
      • 2018-01-31
      • 1970-01-01
      • 2021-04-02
      • 2020-03-11
      • 1970-01-01
      • 2018-12-08
      相关资源
      最近更新 更多