原文作者:我辈李想
版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。
【DRF配置管理】Django安装DRF框架并生成openapi风格文档
【DRF配置管理】如何实现JWT身份验证
【DRF配置管理】如何使用序列化:验证码、注册和登录
【DRF配置管理】如何结合ORM实现排序、模糊搜索、范围查询
【DRF配置管理】如何在视图类使用get_objects()
【DRF配置管理】如何实现RBAC页面菜单和按钮权限
【DRF配置管理】如何建立coreapi风格api接口文档
【DRF配置管理】如何建立swagger风格api接口文档
from myapp.models import Purchase
from myapp.serializers import PurchaseSerializer
from rest_framework import generics
class PurchaseList(generics.ListAPIView):
serializer_class = PurchaseSerializer
def get_queryset(self):
"""
This view should return a list of all the purchases
for the currently authenticated user.
"""
user = self.request.user
return Purchase.objects.filter(purchaser=user)
查询链接:http://example.com/api/purchases?username=denvercoder9
class PurchaseList(generics.ListAPIView):
serializer_class = PurchaseSerializer
def get_queryset(self):
"""
Optionally restricts the returned purchases to a given user,
by filtering against a `username` query parameter in the URL.
"""
queryset = Purchase.objects.all()
username = self.request.query_params.get('username')
if username is not None:
queryset = queryset.filter(purchaser__username=username)
return queryset
如果想使用orm的__gte、__lte这些方法,可以在这里实现(缺陷是都需要重写),具体代码如下:
查询链接:/api/v1/sar/sarpics/?page=1&size=1&ImagingTime__gte=2020-12-22T00%3A00%3A00Z&ImagingTime__lte=2021-06-22T00%3A00%3A00Z
def get_queryset(self):
print('gte', self.request.query_params.get('ImagingTime__gte'))
ImagingTime__gte = self.request.query_params.get('ImagingTime__gte')
ImagingTime__lte = self.request.query_params.get('ImagingTime__lte')
if ImagingTime__gte:
self.queryset = self.queryset.filter(ImagingTime__gte=ImagingTime__gte)
if ImagingTime__lte:
self.queryset = self.queryset.filter(ImagingTime__lte=ImagingTime__lte)
return self.queryset
django_filters需要导入django-filter库,
查询链接:http://example.com/api/products?category=clothing&in_stock=True
import django_filters.rest_framework
from django.contrib.auth.models import User
from myapp.serializers import UserSerializer
from rest_framework import generics
from django_filters.rest_framework import DjangoFilterBackend
class UserListView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
filter_backends = [DjangoFilterBackend,]
filterset_fields = ['category', 'in_stock'] # 可指定查询字段,默认无
需要自定义FilterSet类,并在视图类中指定filter_class。
filters.py文件
import django_filters
class ProductFilter(django_filters.FilterSet):
name = django_filters.CharFilter(lookup_expr='iexact') # iexact表示精确匹配, 并且忽略大小写
author = django_filters.CharFilter(lookup_expr='icontains') #icontains表示模糊查询(包含),并且忽略大小写
price = django_filters.NumberFilter(look_expr='exact') #exact表示精确匹配
desc = django_filters.CharFilter('description', lookup_expr='contains') #对'description'字段进行操作,不填默认为desc
#price__lte = django_filters.NumberFilter('price', lookup_expr='lte') #lte表示小于
#price__gte = django_filters.NumberFilter('price', look_expr='gte') # gte表示大于
class Meta:
model = Product
fields = ['name', 'author', 'price', 'description']
#fields = {
'price': ['lt', 'gt']
}
view.py文件
import django_filters.rest_framework
from django.contrib.auth.models import User
from myapp.serializers import UserSerializer
from rest_framework import generics
from django_filters.rest_framework import DjangoFilterBackend
class UserListView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
filter_backends = [DjangoFilterBackend,]
filterset_fields = ['category', 'in_stock'] # 可指定查询字段,默认全部
filter_class = ProductFilter
查询链接:http://example.com/api/users?search=russell
from rest_framework import filters
class UserListView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
filter_backends = [filters.SearchFilter]
search_fields = ['username', 'email']
查询链接:http://example.com/api/users?ordering=username ;
http://example.com/api/users?ordering=-username ;
http://example.com/api/users?ordering=account,username
from rest_framework.filters import OrderingFilter, SearchFilter
class UserListView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
filter_backends = [OrderingFilter]
ordering_fields = ['username', 'email']
ordering = ['username'] #默认排序