在django-rest-framework的过滤器中使用自定义方法

tom*_*ell 10 python django django-filter django-rest-framework

我想在我的REST API中过滤查询参数 - 请参阅django docs.但是,我希望过滤的一个参数只能通过模型​​@property获得

models models.py:

class Listing(models.Model):
    product = models.OneToOneField(Product, related_name='listing')
    ...
    @property
    def category(self):
        return self.product.assets[0].category.name
Run Code Online (Sandbox Code Playgroud)

这是我的Listing API的设置,符合django-filter docs

    class ListingFilter(django_filters.FilterSet):
        product = django_filters.CharFilter(name='product__name')
        category = django_filters.CharFilter(name='category') #DOES NOT WORK!!

        class Meta:
            model = Listing
            fields = ['product','category']

    class ListingList(generics.ListCreateAPIView):
        queryset = Listing.objects.all()
        serializer_class = ListingSerializer
        filter_class = ListingFilter
Run Code Online (Sandbox Code Playgroud)

我怎样才能通过listing.category进行适当的过滤?它不是直接在列表模型上提供的.

tom*_*ell 16

使用'action'参数指定自定义方法 - 请参阅django-filter docs

首先定义一个使用category参数的值过滤查询集的方法:

    def filter_category(queryset, value):
        if not value:
            return queryset

        queryset = ...custom filtering on queryset using 'value'...
        return queryset
Run Code Online (Sandbox Code Playgroud)

列表过滤器应如下所示:

    class ListingFilter(django_filters.FilterSet):
        ...
        category = django_filters.CharFilter(action=filter_category)
        ...
Run Code Online (Sandbox Code Playgroud)

  • 只是快速注意到django-filter`action`已被`method`取代.http://django-filter.readthedocs.io/en/latest/migration.html (5认同)
  • [文档参考 MIgration 1.0 将“action”更改为“method”](https://django-filter.readthedocs.io/en/latest/guide/migration.html?highlight=MethodFilter#methodfilter-and-filter-action-replaced -通过过滤器方法-382) (2认同)