django def django-filter的method过滤
Posted chenyishi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django def django-filter的method过滤相关的知识,希望对你有一定的参考价值。
1.View Demo
from django.shortcuts import render from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from rest_framework.parsers import JSONParser from rest_framework import mixins, generics from rest_framework.generics import ListAPIView from rest_framework.pagination import PageNumberPagination from goods.models import Goods, GoodsCategory from goods.serializer import GoodsSerializer, CategorySerializer from rest_framework import viewsets from django_filters.rest_framework import DjangoFilterBackend import django_filters from rest_framework import filters from django.db.models import Q class GoodsFilter(django_filters.rest_framework.FilterSet): category_id = django_filters.rest_framework.NumberFilter(method=‘filter_catetory_id‘) def filter_catetory_id(self, queryset, name, value): return queryset.filter(Q(category_id=value) | Q(category__parent_category_id=value) | Q( category__parent_category__parent_category_id=value)) class Meta: model = Goods fields = [‘category_id‘] class GoodsList(mixins.ListModelMixin, viewsets.GenericViewSet): class GoodsPagination(PageNumberPagination): page_size = 2 page_size_query_param = ‘pageSize‘ page_query_param = ‘p‘ max_page_size = 100 queryset = Goods.objects.all() # 不能切片后再过滤,例如:Goods.objects.all()[:10] serializer_class = GoodsSerializer pagination_class = GoodsPagination filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter) search_fields = (‘=name‘,) # 文档:https://www.django-rest-framework.org/api-guide/filtering/#searchfilter ordering_fields = (‘name‘,) # filter_fields = (‘name‘,) #逗号必加,缺点无法模糊查询 filterset_class = GoodsFilter
2.SerializerDemo
class GoodsSerializer(serializers.ModelSerializer): """ Goods的serializer """ # 自定义,可以获取到外键数据 # read_only表示只用在获取数据 category_obj = CategorySerializer(source=‘category‘,read_only=True) category_name = serializers.CharField(source=‘category.name‘,read_only=True) class Meta: model = Goods # 外键写类里的名就可以 # fields = (‘name‘,‘chick_num‘,‘category‘) fields = ‘__all__‘
3.test
以上是关于django def django-filter的method过滤的主要内容,如果未能解决你的问题,请参考以下文章
初始值不适用于 django-filters 上的 ChoiceField