from django.db.models import Q
from django.shortcuts import render
# Create your views here.
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.pagination import PageNumberPagination
from rest_framework.filters import OrderingFilter
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from rest_framework.views import APIView
from rest_framework.decorators import action
from rest_framework.permissions import AllowAny, IsAdminUser, IsAuthenticated, IsAuthenticatedOrReadOnly, BasePermission
from .Page import PageNum
from .Permission import MyPermission
from .models import *
from .serializers import *
from rest_framework.throttling import UserRateThrottle
# 测试与vue跨域
class C(APIView):
permission_classes = (AllowAny,)
def get(self, request):
return Response({"msg": "ok"})
# 用户
# Create your views here.
class UserModelViewSet(ModelViewSet):
queryset = User.objects.all()
serializer_class = UserModelSerializer
# 分页:自定义分页器 覆盖全局配置
pagination_class = PageNum
filter_backends = (DjangoFilterBackend, OrderingFilter) # 同时支持过滤和排序
# # 2.权限:自定义权限类
permission_classes = (MyPermission,)
# # 4.限流:自定义限流类
# throttle_classes = [UserRateThrottle]
# # 5.过滤:指定过滤方法类, 排序方法类, 一个或多个
# filter_backends = (DjangoFilterBackend, OrderingFilter) # 同时支持过滤和排序
# # 5.1指定排序字段, 不设置, 排序功能不起效
ordering_fields = ('date_joined', 'id') # ?ordering=-id
# # 5.2指定过滤字段, 不设置, 过滤功能不起效
filter_fields = ('username', 'mobile', 'is_active') # ?username = tom & phone = & is_active = true
# 根据不同的请求, 获得不同的序列化器
def get_serializer_class(self):
if self.action == 'unactived':
return UserUnActiveSerializer
else:
return UserSerializer
@action(methods=['get'], detail=False)
def unactived(self, request, *args, **kwargs):
# 获取查询集, 过滤出未激活的用户
qs = self.queryset.filter(is_active=False)
# 使用序列化器, 序列化查询集, 并且是
ser = self.get_serializer(qs, many=True)
return Response(ser.data)
@action(methods=['get'], detail=False)
def actived(self, request, *args, **kwargs):
# 获取查询集, 过滤出未激活的用户
qs = self.queryset.filter(is_active=True)
# 使用序列化器, 序列化查询集, 并且是
ser = self.get_serializer(qs, many=True)
return Response(ser.data)
# 测试注册接口
class RegisetrApiView(APIView):
permission_classes = (AllowAny,)
def post(self, request):
username = request.data.get("username")
password = request.data.get("password")
mobile = request.data.get("mobile")
email = request.data.get("email")
ser = UserModelSerializer(data={"username": username, "password": password, "mobile": mobile, "email": email})
# ser = UserModelSerializer(data=request.data)
if ser.is_valid():
ser.save()
return Response({"msg": "ok"})
else:
return Response({"msg": "no", "error": ser.errors})
# 搜索接口
class SearchApiView(APIView):
def post(self, request):
search_name = request.data.get("search_name")
return Response(
UserModelSerializer(User.objects.filter(Q(username=search_name) | Q(mobile=search_name) | Q(email=search_name)),many=True).data)