'''
1 有车型(CarModel),车厂(CarFactory),经销商(Distributor)三个表,
一个车厂可以生产多种车型,一个经销商可以出售多种车型,一个车型可以有多个经销商出售车型:车型名,车型出厂价,车厂id车厂:车厂名,车厂地址,联系电话经销商:经销商名,地址,联系电话
2 有用户表,基于django内置user表,扩展mobile字段
3 编写登陆接口,jwt方式返回token,格式为{status:100,msg:登陆成功,token:safasdfa}
4 所有接口(除登录外),必须登录后才能访问
5 管理员登陆后可以增,删,单查,群查,改 车型,车厂,经销商(具备所有接口权限)
6 普通用户登陆可以查看车型,车厂,经销商单条,所有(只有查看权限)
7 所有查询所有接口带分页功能
8 查询所有车型接口,可以按车型名字精准过滤加分项:
用户注册接口
管理员有用户锁定,删除用户功能
''' 
from  django. db import  modelsfrom  django. contrib. auth. models import  AbstractUserclass  User ( AbstractUser) : mobile =  models. CharField( max_length= 32 ,  verbose_name= '联系电话' ) 
class  CarModel ( models. Model) : name =  models. CharField( max_length= 32 ,  verbose_name= '车型名' ) init_price =  models. IntegerField( verbose_name= '出厂价' ) factory =  models. ForeignKey( to= 'CarFactory' ,  on_delete= models. CASCADE,  verbose_name= '车厂id' ) distributors =  models. ManyToManyField( to= 'Distributor' ,  verbose_name= '经销商' ) class  Meta : verbose_name_plural =  '经销商表' def  __str__ ( self) : return  self. namedef  factory_info ( self) : '''车厂信息''' return  { 'name' :  self. factory. name,  'addr' :  self. factory. addr,  'mobile' :  self. factory. mobile} def  distributor_info ( self) : '''经销商信息''' distributor_info_list =  [ ] for  distributor in  self. distributors. all ( ) : distributor_info_list. append( { 'name' :  distributor. name,  'addr' :  distributor. addr, 'mobile' :  distributor. mobile} ) return  distributor_info_list
class  CarFactory ( models. Model) : name =  models. CharField( max_length= 32 ,  verbose_name= '车厂名' ) addr =  models. CharField( max_length= 32 ,  verbose_name= '车厂地址' ) mobile =  models. CharField( max_length= 32 ,  verbose_name= '联系电话' ) class  Meta : verbose_name_plural =  '经销商表' def  __str__ ( self) : return  self. name
class  Distributor ( models. Model) : name =  models. CharField( max_length= 32 ,  verbose_name= '经销商名' ) addr =  models. CharField( max_length= 32 ,  verbose_name= '地址' ) mobile =  models. CharField( max_length= 32 ,  verbose_name= '联系电话' ) class  Meta : verbose_name_plural =  '经销商表' def  __str__ ( self) : return  self. namedef  jwt_response_payload_handler ( token,  user,  request) : return  { 'code' :  100 , 'msg' :  '登录成功' , 'token' :  token} 
from  rest_framework. views import  exception_handler
from  rest_framework. response import  Responsedef  common_exception ( exc,  context) : res =  exception_handler( exc,  context) if  not  res: return  Response( { 'code' :  999 ,  'msg' :  f'非drf错误,错误信息是: { str ( exc) } ' } ) return  Response( { 'code' :  666 ,  'msg' :  f'这是drf错误,错误信息是: { res. data. get( "detail" ) } ' } ) JWT_AUTH =  { 'JWT_RESPONSE_PAYLOAD_HANDLER' :  'app01.jwt_response.jwt_response_payload_handler' , 'JWT_EXPIRATION_DELTA' :  datetime. timedelta( days= 1 ) 
} REST_FRAMEWORK =  { 'EXCEPTION_HANDLER' :  'app01.exceptions.common_exception' , 
} 
from  rest_framework. pagination import  PageNumberPaginationclass  MyPageNumberPagination ( PageNumberPagination) : page_size =  3   max_page_size =  5   from  rest_framework import  serializersfrom  app01. models import  User,  CarModel,  CarFactory,  Distributorclass  UserSerializer ( serializers. ModelSerializer) : class  Meta : model =  Userfields =  [ 'username' ,  'password' ,  'mobile' ] extra_kwargs =  { 'password' :  { 'write_only' :  True } } def  create ( self,  validated_data) : user =  User. objects. create_user( ** validated_data) return  userclass  CarModelSerializer ( serializers. ModelSerializer) : class  Meta : model =  CarModelfields =  [ 'id' ,  'name' ,  'init_price' ,  'factory' ,  'distributors' ,  'factory_info' ,  'distributor_info' ] extra_kwargs =  { 'factory' :  { 'write_only' :  True } , 'distributors' :  { 'write_only' :  True } , 'factory_info' :  { 'read_only' :  True } , 'distributor_info' :  { 'read_only' :  True } , } class  CarFactorySerializer ( serializers. ModelSerializer) : class  Meta : model =  CarFactoryfields =  '__all__' class  DistributorSerializer ( serializers. ModelSerializer) : class  Meta : model =  Distributorfields =  '__all__' from  rest_framework. permissions import  BasePermission
from  rest_framework. exceptions import  AuthenticationFailedclass  MyPermission ( BasePermission) : def  has_permission ( self,  request,  view) : print ( view. action) if  not  request. user. is_superuser and  request. method !=  'GET' : raise  AuthenticationFailed( '普通用户,权限不足' ) return  True from  rest_framework. viewsets import  ViewSet
from  rest_framework. generics import  GenericAPIView
from  rest_framework. mixins import  CreateModelMixinfrom  . models import  User
from  . serializer import  UserSerializerfrom  rest_framework. response import  Responseclass  UserView ( ViewSet,  GenericAPIView,  CreateModelMixin) : queryset =  User. objects. all ( ) serializer_class =  UserSerializerdef  create ( self,  request,  * args,  ** kwargs) : ser =  self. get_serializer( data= request. data) if  ser. is_valid( ) : ser. save( ) return  Response( { 'code' :  100 ,  'msg' :  '注册成功' ,  'result' :  ser. data} ) return  Response( { 'code' :  101 ,  'msg' :  '注册失败' ,  'result' :  ser. errors} ) from  rest_framework. mixins import  DestroyModelMixin
from  rest_framework_jwt. authentication import  JSONWebTokenAuthentication
from  rest_framework. permissions import  IsAuthenticated,  IsAdminUser
from  rest_framework. decorators import  actionclass  AdminView ( ViewSet,  GenericAPIView,  DestroyModelMixin) : queryset =  User. objects. all ( ) authentication_classes =  [ JSONWebTokenAuthentication] permission_classes =  [ IsAuthenticated,  IsAdminUser] @action ( methods= [ 'DELETE' ] ,  detail= True ) def  delete_user ( self,  request,  * args,  ** kwargs) : return  self. destroy( request,  * args,  ** kwargs) @action ( methods= [ 'GET' ] ,  detail= True ) def  lock ( self,  request,  * args,  ** kwargs) : user =  self. get_object( ) if  user is  None : return  Response( { 'code' :  101 ,  'msg' :  '用户不存在' } ) if  user. is_active: user. is_active =  False user. save( ) return  Response( { 'code' :  100 ,  'msg' :  '用户锁定成功' } ) return  Response( { 'code' :  102 ,  'msg' :  '用户已经被锁定' } ) @action ( methods= [ 'GET' ] ,  detail= True ) def  unlock ( self,  request,  * args,  ** kwargs) : user =  self. get_object( ) if  user is  None : return  Response( { 'code' :  101 ,  'msg' :  '用户不存在' } ) if  user. is_active is  False : user. is_active =  True user. save( ) return  Response( { 'code' :  100 ,  'msg' :  '用户解锁成功' } ) return  Response( { 'code' :  102 ,  'msg' :  '用户已经解锁过了' } ) from  rest_framework. viewsets import  ModelViewSetfrom  . models import  CarModel
from  . serializer import  CarModelSerializer
from  . permissions import  MyPermission
from  . page import  MyPageNumberPaginationfrom  django_filters. rest_framework import  DjangoFilterBackendclass  CarModelView ( ModelViewSet) : queryset =  CarModel. objects. all ( ) serializer_class =  CarModelSerializerauthentication_classes =  [ JSONWebTokenAuthentication] permission_classes =  [ IsAuthenticated,  MyPermission] pagination_class =  MyPageNumberPaginationfilter_backends =  [ DjangoFilterBackend] filterset_fields =  [ 'name' ] from  . models import  CarFactory
from  . serializer import  CarFactorySerializerclass  CarFactoryView ( ModelViewSet) : queryset =  CarFactory. objects. all ( ) serializer_class =  CarFactorySerializerpagination_class =  MyPageNumberPaginationauthentication_classes =  [ JSONWebTokenAuthentication] permission_classes =  [ IsAuthenticated,  MyPermission] from  . models import  Distributor
from  . serializer import  DistributorSerializerclass  DistributorView ( ModelViewSet) : queryset =  Distributor. objects. all ( ) serializer_class =  DistributorSerializerpagination_class =  MyPageNumberPaginationauthentication_classes =  [ JSONWebTokenAuthentication] permission_classes =  [ IsAuthenticated,  MyPermission] 
from  django. contrib import  admin
from  django. urls import  path,  includefrom  rest_framework_jwt. views import  obtain_jwt_tokenfrom  rest_framework. routers import  SimpleRouterfrom  app01. views import  UserView,  AdminView,  CarModelView,  CarFactoryView,  DistributorViewrouter =  SimpleRouter( ) router. register( 'user' ,  UserView,  'user' ) 
router. register( 'admin' ,  AdminView,  'admin' ) router. register( 'carMode' ,  CarModelView,  'carMode' ) 
router. register( 'carFactory' ,  CarFactoryView,  'carFactory' ) 
router. register( 'distributor' ,  DistributorView,  'distributor' ) urlpatterns =  [ path( 'login/' ,  obtain_jwt_token) , path( '' ,  include( router. urls) ) 
]