本地网站搭建工具,自己做的网站怎么发布视频教程,品牌营销网站建设流程,网站制作程序下载用drf编写 1 有车型(CarModel)#xff0c;车厂#xff08;CarFactory#xff09;#xff0c;经销商(Distributor)三个表,
一个车厂可以生产多种车型#xff0c;一个经销商可以出售多种车型#xff0c;一个车型可以有多个经销商出售车型#xff1a;车型名#xff0c;车型…用drf编写 1 有车型(CarModel)车厂CarFactory经销商(Distributor)三个表,
一个车厂可以生产多种车型一个经销商可以出售多种车型一个车型可以有多个经销商出售车型车型名车型出厂价车厂id车厂车厂名车厂地址联系电话经销商经销商名地址联系电话
2 有用户表基于django内置user表扩展mobile字段
3 编写登陆接口jwt方式返回token格式为{status:100,msg:登陆成功tokensafasdfa}
4 所有接口除登录外必须登录后才能访问
5 管理员登陆后可以增删单查群查改 车型车厂经销商(具备所有接口权限)
6 普通用户登陆可以查看车型车厂经销商单条所有(只有查看权限)
7 所有查询所有接口带分页功能
8 查询所有车型接口可以按车型名字精准过滤加分项
用户注册接口
管理员有用户锁定删除用户功能models.py
from django.db import modelsfrom django.contrib.auth.models import AbstractUserclass User(AbstractUser):mobile models.CharField(max_length32, verbose_name联系电话)# 车型
class CarModel(models.Model):name models.CharField(max_length32, verbose_name车型名)init_price models.IntegerField(verbose_name出厂价)factory models.ForeignKey(toCarFactory, on_deletemodels.CASCADE, verbose_name车厂id)distributors models.ManyToManyField(toDistributor, 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_length32, verbose_name车厂名)addr models.CharField(max_length32, verbose_name车厂地址)mobile models.CharField(max_length32, verbose_name联系电话)class Meta:verbose_name_plural 经销商表def __str__(self):return self.name# 经销商
class Distributor(models.Model):name models.CharField(max_length32, verbose_name经销商名)addr models.CharField(max_length32, verbose_name地址)mobile models.CharField(max_length32, verbose_name联系电话)class Meta:verbose_name_plural 经销商表def __str__(self):return self.name
新建一个jwt_response.py验证登录
def jwt_response_payload_handler(token, user, request):return {code: 100,msg: 登录成功,token: token}新建一个exceptions.py验证错误
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)}})
settings.py配置文件中
JWT_AUTH {JWT_RESPONSE_PAYLOAD_HANDLER: app01.jwt_response.jwt_response_payload_handler,JWT_EXPIRATION_DELTA: datetime.timedelta(days1)
}REST_FRAMEWORK {EXCEPTION_HANDLER: app01.exceptions.common_exception,
}新建page.py分页
from rest_framework.pagination import PageNumberPaginationclass MyPageNumberPagination(PageNumberPagination):page_size 3 # 每页显示3条max_page_size 5 # 每页最大显示5条
新建serializer.py分页
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__
新建permission.py权限
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
views.py视图中
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(datarequest.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]# detailTrue 表示可以删除单个资源action(methods[DELETE], detailTrue)def delete_user(self, request, *args, **kwargs):return self.destroy(request, *args, **kwargs)action(methods[GET], detailTrue)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 Falseuser.save()return Response({code: 100, msg: 用户锁定成功})return Response({code: 102, msg: 用户已经被锁定})action(methods[GET], detailTrue)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 Trueuser.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 CarModelSerializer# 认证authentication_classes [JSONWebTokenAuthentication]# 权限permission_classes [IsAuthenticated, MyPermission]# 分页pagination_class MyPageNumberPagination# 过滤filter_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]
urls.py路由中 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))
]