【问题标题】:Django rest framework custom filter - order search by children countDjango rest 框架自定义过滤器 - 按子项计数的顺序搜索
【发布时间】:2017-10-14 00:20:17
【问题描述】:

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

模型是:具有许多 OrderItems 的订单。任务是创建过滤器,允许按订单项数搜索订单或按数量排序。

在我看来.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 我收到错误: 相关字段查找无效:​​计数

如何为模型的孩子数创建自定义过滤器?谢谢你。

附:这是我关于stackowerflow的第一个问题,对于样式错误感到抱歉。

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

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

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-06
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 2019-07-23
      • 2015-08-24
      • 2015-01-23
      相关资源
      最近更新 更多