Django休息框架自定义过滤器 - 按子项排序搜索

时间:2017-05-15 09:21:27

标签: django django-rest-framework

我将DRFdjango-rest-framework-filters一起使用。

模型是:具有许多OrderItem的订单。任务是创建过滤器,可以按订单项计数或按计数排序来搜索订单。

在我的view.py中:

class OrderFilter(filters.FilterSet):
    order_items_count = filters.NumberFilter(name="order_items__count")
    customer = filters.RelatedFilter(
        CustomerFilter,
        name='customer',
        queryset=Customer.objects.all(),
        )

    class Meta:
        model = Order
        fields = {
            'internal_code': ['icontains'],
            'notes': ['icontains'],
            'status': ['exact'],
            'complete': ['exact'],
            'order_items_count': ['exact']
            }

class OrderViewSet(BaseViewSet, viewsets.ModelViewSet):
    queryset = Order.objects.all()
    serializer_class = OrderSerializer
    filter_class = OrderFilter
    filter_backends = (
        OrderingFilter,
        DjangoFilterBackend,
        )
    ordering_fields = (
        'internal_code',
        'notes',
        'status',
        'complete',
        'customer__title',
        'order_items__count',
        )

根据请求/orders?order_items_count=2我收到错误: 相关字段无效查找:count

如何为模特儿童的数量创建自定义过滤器?谢谢。

P.S。这是我关于stackowerflow的第一个问题,对不起样式错误。

1 个答案:

答案 0 :(得分:4)

首先将视图集上的查询集更改为:

queryset = Order.objects.annotate(order_items_count=Count('order_items')).all()

这将确保查询集具有字段order_items_count

将此用作order_items_count过滤器

order_items_count = filters.NumberFilter(method='filter_orders_by_item_count')

def filter_orders_by_item_count(self, queryset, name, value):
    return queryset.filter(order_items_count=value)

对于非模型字段的排序使用链接[1]

中描述的自定义排序过滤器

自定义过滤器上的过滤方法将是:

def filter(self, qs, value):
        # OrderingFilter is CSV-based, so `value` is a list
        if any(v in ['order_items_count', '-order_items_count'] for v in value):
            return queryset.order_by(value)
        return super(CustomOrderingFilter, self).filter(qs, value)

[1] https://django-filter.readthedocs.io/en/develop/ref/filters.html#adding-custom-filter-choices