Django的MVT框架中的V
我们已经大致了解了,接下来学习M
准备工作 安装访问MySQL的模块 1 $ pip install mysqlclient
现在不推荐使用pymysql了
建立数据库 1 mysql> CREATE DATABASE `school` CHARACTER SET utf8;
配置连接 settings.py 1 2 3 4 5 6 7 8 9 10 11 12 DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + 'ENGINE': 'django.db.backends.mysql', + 'NAME': '<数据库名>', + 'USER': '<用户名>', + 'PASSWORD': '<密码>', + 'HOST': '<地址>', + 'PORT': <端口>, } }
推荐有条件的使用docker容器
建立模型 这里有两种方式
模型迁移到数据库 阅读官方文档 可知,它建表时会自动添加好主键id并自增
创建model models.py 1 2 3 4 class Teacher (models.Model) : user_name = models.CharField(max_length=200 ) id_card = models.IntegerField()
详细参数如后台显示名字,注释,设定范围,时间戳,空白允许,空白值,主键……这些请参考官方文档
迁移model到数据库 1 2 $ python manage.py makemigrations [模块名] $ python manage.py migrate [模块名]
方括号为可选参数,这里我只需要demo
查看
1 2 3 4 5 6 7 8 9 mysql> DESC demo_teacher; +-----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | user_name | varchar(200) | NO | | NULL | | | id_card | int(11) | NO | | NULL | | +-----------+--------------+------+-----+---------+----------------+ 3 rows in set (0.05 sec)
迁移过之后,我们会发现在数据库中多了迁移模型的数据表,查看相应表也可以看到我们所建立的字段和类型。
但也多了几张表,其中一张便是django_migrations,这张表即是记录我们在每次执行迁移操作时记录的迁移文件的数据表。
具体记录的是模块和与其对应的迁移文件名。
数据库迁移到模型 建表 1 2 3 4 5 CREATE TABLE `student` (`id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT "主键id" , `name` VARCHAR ( 16 ) NOT NULL DEFAULT "" COMMENT "姓名" ,`school_number` VARCHAR ( 20 ) NOT NULL DEFAULT "" COMMENT "学号" ,`gender` VARCHAR ( 4 ) NOT NULL COMMENT "性别" );
迁移 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 $ python manage.py inspectdb from django.db import models class Student(models.Model): name = models.CharField(max_length=16) school_number = models.CharField(max_length=20) gender = models.CharField(max_length=4) class Meta: managed = False db_table = 'student'
输出中有一个managed = False
,如果需要对数据库进行增删改操作,请把它删除或改为True
我们可以把输出管道传输至models.py
1 $ python manage.py inspectdb >> demo/models.py
Tips 从数据库生成还会产生django_migrations
对应的类,我们通过makemigrations生成的文件可以视为一个数据库版本控制系统,因此我把Student和Teacher类都通过模型迁移到数据库的方式处理了。
增删改查(CRUD) 增 Create 用法 1 2 3 4 models.表名.objects.create(参数)
代码 url映射省略
views.py 1 2 3 def insertTeacher (request) : models.Teacher.objects.create(user_name=request.GET.get('name' ), id_card=int(request.GET.get('idCard' , default=0 ))) return HttpResponse('OK' )
效果 1 2 3 4 5 6 7 mysql> select * from demo_teacher; +----+-----------+---------+ | id | user_name | id_card | +----+-----------+---------+ | 1 | wei | 111111 | +----+-----------+---------+ 1 row in set (0.06 sec)
查 Read 用法 1 2 3 4 5 6 7 models.对象.objects.all() models.对象.objects.values('xxx' ) models.对象.objects.values_list('xxx' , 'yyy' ) models.对象.objects.get(id=1 ) models.对象.objects.order_by("-字段名" )
代码 views.py 1 2 3 def selectAllTeacher (request) : li = models.Teacher.objects.all().values() return JsonResponse(list(li), safe=False )
一个QuerySet对象作为json返回,必须添加safe=False
参数
效果
改 Update 用法 1 models.对象.objects.filter(筛选条件).update(更新内容)
代码 view.py 1 2 3 def updateTeacher (request) : models.Teacher.objects.filter(id=request.GET.get('id' )).update(user_name=request.GET.get('name' )) return JsonResponse(list(models.Teacher.objects.all().values()), safe=False )
效果
删 Delete 用法 1 models.类名.objects.filter(条件).delete()
代码 view.py 1 2 3 def deleteTeacher (request) : models.Teacher.objects.filter(id=request.GET.get('id' )).delete() return JsonResponse(list(models.Teacher.objects.all().values()), safe=False )
效果
示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 from django.db.models import Count, Min, Max, Sum
写在最后 还没从Spring Boot的思想中转换出来,一开始想用类似于mybatis手写SQL语句的方法:
1 2 3 4 5 6 def getdata (request) : with connection.cursor() as cursor: cursor.execute('select id, machine, tomcathome, ipaddress, description from tomcatData' ) data = dictfetchall(cursor) return JsonResponse(data, safe=False , json_dumps_params={'ensure_ascii' : False })
太憨了,
最让我惊喜的是Django竟然自带热部署,springboot的热部署插件还是收费的