有车型(CarModel),车厂(CarFactory),经销商(Distributor)三个表

用drf编写

'''
1 有车型(CarModel),车厂(CarFactory),经销商(Distributor)三个表,
一个车厂可以生产多种车型,一个经销商可以出售多种车型,一个车型可以有多个经销商出售车型:车型名,车型出厂价,车厂id车厂:车厂名,车厂地址,联系电话经销商:经销商名,地址,联系电话
2 有用户表,基于django内置user表,扩展mobile字段
3 编写登陆接口,jwt方式返回token,格式为{status:100,msg:登陆成功,token:safasdfa}
4 所有接口(除登录外),必须登录后才能访问
5 管理员登陆后可以增,删,单查,群查,改 车型,车厂,经销商(具备所有接口权限)
6 普通用户登陆可以查看车型,车厂,经销商单条,所有(只有查看权限)
7 所有查询所有接口带分页功能
8 查询所有车型接口,可以按车型名字精准过滤加分项:
用户注册接口
管理员有用户锁定,删除用户功能
'''

models.py

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.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(days=1)
}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(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]# detail=True 表示可以删除单个资源@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 = Falseuser.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 = 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))
]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/145827.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

网络-Ajax

文章目录 前言一、Ajax优点:缺点: 二、使用步骤XNLHttpRequest对象完整代码 总结 前言 本文主要记录Ajax技术的简介,以及用法。 一、Ajax Ajax是一组用于在Web浏览器和Web服务器之间进行异步通信的Web开发技术。 它代表着Asynchronous Java…

解决大模型行业落地三大挑战,华为云GaussDB向量数据库正式发布

随着AI大模型产品及应用呈现爆发式增长,新的AI时代已经到来。向量数据库可与大语言模型配合使用,解决大模型落地过程中的痛点,已成为企业数据处理和应用大模型的必选项。在近日举行的华为全联接大会2023期间,华为云正式发布GaussDB向量数据库。GaussDB向量数据库基于GaussD…

Android 使用Kotlin封装RecyclerView

文章目录 1.概述2.运行效果图3.代码实现3.1 扩展RecyclerView 3.2 扩展Adapter3.3 RecyclerView装饰绘制3.3.1 以图片实现分割线3.3.2 画网格线3.3.3空白的分割线3.3.4 不同方向上的分割线 3.4 使用方法 1.概述 在一个开源项目上看到了一个Android Kotlin版的RecyclerView封装…

Docker和Docker compose的安装使用指南

一,环境准备 Docker运行需要依赖jdk,所以需要先安装一下jdk yum install -y java-1.8.0-openjdk.x86_64 二,Docker安装和验证 1,安装依赖工具 yum install -y yum-utils 2,设置远程仓库 yum-config-manager --add-r…

26962-2011 高频电磁场综合水处理器技术条件

声明 本文是学习GB-T 26962-2011 高频电磁场综合水处理器技术条件. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了高频电磁场综合水处理器(以下简称处理器)的术语和定义、分类和型号、结构型式、 要求及检验、标志、包装和贮运…

Java | Maven(知识点查询)

文章目录 Maven知识速查1. Maven概述2. Maven的作用3. Maven的下载4. Maven的环境配置5. Maven 的基础组成5.1 Maven仓库5.1.1 本地仓库配置:5.1.2 中央仓库配置:5.1.3 镜像仓库配置 5.2 Maven坐标 6. Maven项目6.1 手工创建Maven项目6.2 自动构建项目 7…

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— Web APIs(三)

思维导图 全选案例 大按钮控制小按钮 小按钮控制大按钮 css伪类选择器checked <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><…

理解自动驾驶感知技术

理解自动驾驶感知技术 文章目录 什么是自动驾驶感知技术&#xff1f;自动驾驶感知技术的关键组成部分1. 雷达&#xff08;Radar&#xff09;2. 摄像头&#xff08;Camera&#xff09;3. 激光雷达&#xff08;Lidar&#xff09;4. 超声波传感器&#xff08;Ultrasonic Sensors&a…

ElementUI实现登录注册啊,axios全局配置,CORS跨域

一&#xff0c;项目搭建 认识ElementUI ElementUI是一个基于Vue.js 2.0的桌面端组件库&#xff0c;它提供了一套丰富的UI组件&#xff0c;包括表格、表单、弹框、按钮、菜单等常用组件&#xff0c;具备易用、美观、高效、灵活等优势&#xff0c;能够极大的提高Web应用的开发效…

【Spring Cloud】深入探索 Nacos 注册中心的原理,服务的注册与发现,服务分层模型,负载均衡策略,微服务的权重设置,环境隔离

文章目录 前言一、初识 Nacos 注册中心1.1 什么是 Nacos1.2 Nacos 的安装&#xff0c;配置&#xff0c;启动 二、服务的注册与发现三、Nacos 服务分层模型3.1 Nacos 的服务分级存储模型3.2 服务跨集群调用问题3.3 服务集群属性设置3.4 修改负载均衡策略为集群策略 四、根据服务…

智慧公厕:探索未来公共厕所的创新设计

近年来&#xff0c;随着城市发展的不断科技化&#xff0c;智慧公厕的设计成为了一个备受关注的话题。作为城市基础设施的重要组成部分&#xff0c;公厕不仅仅是简单的功能性建筑&#xff0c;更是体现了城市形象和管理水平的重要指标。在这篇文章中&#xff0c;我们将以智慧公厕…

GitHub配置SSH key

GitHub配置SSH key Git配置信息并生成密钥 设置用户名和密码 设置用户名 git config --global user.name "用户名" 设置邮箱 git confir --global user.email "邮箱" 生成密钥 ssh-keygen -t rsa -C "邮箱" 查看密钥 到密钥所保存的位置 复…

docker安装MySQL 5.7

1.安装 Mysql 5.7 docker镜像 拉取官方镜像 docker pull mysql:5.7查看镜像库 docker images2.创建mysql容器 在本地创建mysql的映射目录 mkdir -p /root/mysql/data /root/mysql/logs /root/mysql/conf在/root/mysql/conf中创建 *.cnf 文件(叫什么都行) touch my.cnf创建…

CSS详细基础(四)显示模式

本帖开始介绍CSS中更复杂的内容 目录 一.显示模式 1.行内元素 2.块级元素 3.行内块元素 二.背景样式 一.显示模式 顾名思义&#xff0c;在CSS中&#xff0c;元素主要有3种显示模式&#xff1a;行内元素、块级元素、行内块元素~ 所谓块级元素&#xff0c;指的是该元素在…

蓝桥等考Python组别八级005

第一部分&#xff1a;选择题 1、Python L8 &#xff08;15分&#xff09; 运行下面程序&#xff0c;输出的结果是&#xff08; &#xff09;。 i 1 while i < 4: print(i, end ) i 1 1 2 30 1 2 31 2 3 40 1 2 3 4 正确答案&#xff1a;C 2、Python L8 &#…

【51单片机】10-蜂鸣器

1.蜂鸣器的原理 这里的“源”不是指电源。而是指震荡源。 也就是说&#xff0c;有源蜂鸣器内部带震荡源&#xff0c;所以只要一通电就会叫。 而无源内部不带震荡源&#xff0c;所以如果用直流信号无法令其鸣叫。必须用2K~5K的方波去驱动它。 有源蜂鸣器往往比无源的贵&#xff…

pandas--->CSV / JSON

csv CSV&#xff08;Comma-Separated Values&#xff0c;逗号分隔值&#xff0c;有时也称为字符分隔值&#xff0c;因为分隔字符也可以不是逗号&#xff09;&#xff0c;其文件以纯文本形式存储表格数据&#xff08;数字和文本&#xff09;。 CSV 是一种通用的、相对简单的文…

【Java 进阶篇】深入理解 JDBC:Java 数据库连接详解

数据库是现代应用程序的核心组成部分之一。无论是 Web 应用、移动应用还是桌面应用&#xff0c;几乎都需要与数据库交互以存储和检索数据。Java 提供了一种强大的方式来实现与数据库的交互&#xff0c;即 JDBC&#xff08;Java 数据库连接&#xff09;。本文将深入探讨 JDBC 的…

python二维码识别tesseract

window安装tesseract 下载路径&#xff1a; https://digi.bib.uni-mannheim.de/tesseract/ 选择 双击安装在D:\sore\teeseract-OCR后&#xff1a; 配置环境变量 配置环境变量Path&#xff1a;D:\sore\teeseract-OCR 配置语言包的环境变量TESSDATA_PREFIX&#xff1a; D:\s…

数据结构与算法基础-(5)---栈的应用-(1)括号匹配

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…