我将DRF与django-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的第一个问题,对不起样式错误。
答案 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