[ django DRF使用过滤器,分页器,排序 ]


Django的DRF框架使用

表结构

class PurchaseSortList(models.Model):
    date = models.DateField(default=timezone.now, blank=True)
    component = models.CharField(max_length=255, default="", blank=True)
    supplier = models.CharField(max_length=255, default="", blank=True)
    work_group = models.CharField(max_length=255, default="", blank=True)
    description = models.CharField(max_length=255, default="", blank=True)
    cost = models.DecimalField(max_digits=10, decimal_places=2, blank=True)
    stock_level = models.IntegerField()

过滤器/分页器

class PurchaseSortListFilter(filters.FilterSet):
    component = filters.CharFilter(lookup_expr='icontains')
    supplier = filters.CharFilter(lookup_expr='icontains')
    work_group = filters.CharFilter(lookup_expr='exact')
    description = filters.CharFilter(lookup_expr='icontains')
    stock_level = filters.NumberFilter()

    class Meta:
        model = PurchaseSortList
        fields = ["component", "supplier", "work_group", "description", "cost", "stock_level"]


class CustomPageNumberPagination(PageNumberPagination):
    page_query_param = 'page_num'  # 默认是 'page'
    page_size_query_param = 'page_size'  # 默认是 'page_size'
    max_page_size = 100  # 可根据需要调整

视图类

from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters

class PurchaseSortListViewSet(
    GenericViewSet,
    RetrieveModelMixin,
    ListModelMixin,
    UpdateModelMixin,
    CreateModelMixin,
    DestroyModelMixin
):
    queryset = PurchaseSortList.objects.all()
    serializer_class = PurchaseSortListSerializer
    filter_backends = [DjangoFilterBackend, filters.OrderingFilter]
    filterset_class = PurchaseSortListFilter
    pagination_class = CustomPageNumberPagination
    ordering_fields = ['date', 'stock_level', 'cost']
    ordering = ['-id']  # 默认排序字段

请求示例

http://127.0.0.1:8001/api/purchase_sort_list/?page_size=10&page_num=1&ordering=