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)