Django框架之连接数据库及操作
1、静态文件
1、什么是静态文件
网站所使用的提前已经写好的文件,如:js,css,第三方组件bootstrap、fontawesome、sweetalter等等
针对所用到的静态文件放在static文件夹中,需手动创建
2、Django静态文件配置
1、在settings配置文件中配置
STATIC_URL = '/static/' # 此处是访问静态资源的前缀,默认情况下接口前缀名与静态文件名保持一致 STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), os.path.join(BASE_DIR, 'static1'), ] # 此处的static是文件夹路径,当访问时,如果前缀相同,会从这个路径下依次查找资源,都没有会报错
2、解决动态绑定问题
在配置文件中STATIC_URL改变static名使前端的HTML代码都不会改,在templates文件夹下所有HTML文件中动态引入绑定
{% load static %} <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}"> <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
3、form表单中提交方式,默认是get请求,会自动将所请求的数据加在url后
http://127.0.0.1:8000/login/?username=admin&password=123
指定为 method='post' 请求就不会在url后有请求的数据,并且所有的input标签都要写name属性,否则后端接收不到所输入的内容
action属性
1、不写 默认朝当前地址提交数据
2、全路径
3、后缀(/login)
当发送post请求时,需要先配置文件中注释掉一行
2、request对象方法
视图函数应该做到针对不同的请求来做出不同的逻辑处理,比如GET请求应该返回一个HTML文件,POST请求应该获取用户提交的数据然后做一系列逻辑处理,所以我们需要判断请求方式是啥
request对象,用来获取前端的请求方式
request.method # 结果是GET或POST request.POST # 获取post请求提交的数据 结果类似于一个大字典,字典的value是列表套字符串 request.POST.get('username') # 只取列表中的最后一个元素,字符串 request.POST.getlist('username') # 获取整个列表 request.GET # 获取get请求url后携带的数据 结果类似于一个大字典,字典的value是列表套字符串 request.GET.get('username') # 只取列表中的最后一个元素 request.GET.getlist('username') # 获取整个列表
注意:POST请求,即可以通过request.PSOT获取数据,也可以通过request.GET获取携带的数据
通常情况下针对不同的请求应该做不同的判断,但是get请求次数要远大于post请求,所以我们应该对不是get请求的做判断,对get请求不做判断,减少代码层次结构
def login(request): if request.method == 'POST': return HttpResponse('登录请求收到') return render(request, 'login.html')
3、pycharm连接数据库
连接数据库后可以对数据库中数据查看与修改数据
4、Django连接数据库
需要自己手动先创建库,Django支持MySQL5.5及以上版本
1、先去配置文件中配置相关的参数
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 数据库类别 'NAME': 'dome1', # 库名 'HOST': '127.0.0.1', 'POST': 3306, 'USER': 'root', 'PASSWORD': '2694', 'CHARSET': 'utf8' } }
2、在项目名或者应用名下面的__ init__文件中告诉Django使用pymysql连接数据库而不是默认的自带mysqldb
import pymysql pymysql.install_as_MySQLdb()
5、Django的ORM简介
Django的ORM不会帮你创建库只能帮你创建表
ORM的作用:能够让一个不会数据数据库的也能够通过Python的面向对象方法,通过句点符来简单快捷的操作数据
ORM对象关系映射:
类 <<===>> 表
对象 <<===>> 记录
属性 <<===>> 字段值
1、先去models.py文件中写模型类
class User(models.Model): # id可以不创建,Django ORM会自动创建一个名为id的主键字段,如果自己创建了主键就不会自动创建 # id int primary key auto_increment id = models.AutoField(primary_key=True) username = models.CharField(max_length=64) # 此处的char其实数据库中的是varchar,且必须提供max_length password = models.CharField(max_length=32) email = models.EmailField(default='1321241@qq.com') # 此处的EmailField在数据库中是varchar(254) # price为小数字段 总共8位小数位占2位 price = models.DecimalField(max_digits=8,decimal_places=2)
2、每一次从models类中对数据库进行改变操作都要进行:数据库迁移命令,两条命令永远成对出现,只要动了models.py对数据库进行操作,就必须要执行数据库迁移命令
1、将数据库的改动记录到(migrations文件夹)中
- python manage.py makemigrations
2、将真正的改动同步到数据库中
- python manage.py migrate
6、字段的增删改操作
1、字段的增加
两种方式:
1、要么给字段设置默认值
2、运行该字段为空
email = models.EmailField(default='1321241@qq.com') # 设置默认值 hobby = models.CharField(null=True, max_length=(64)) # 设置之前设置的字段默认为空
2、字段的删除
在models中注释掉对应的字段,执行数据库迁移命令即可
3、字段的修改
修改models中对应的代码,执行数据库迁移命令即可
7、数据的增删改查操作
1、数据的增加
两种方式:
1、create()
# 方式一:通过create方法添加数据 user_obj = models.User.objects.create(username=username, password=password)
2、对象的绑定方法
-
先生成一个user对象
-
调用对象的绑定方法
# 方式二:先生成一个user对象,再调用对象的绑定方法 user_obj = models.User(username=username, password=password) user_obj.save()
2、数据的查找
1、查单条和多条指定的数据
filter()
from app01 import models # 相当于SQL语句的select * from user where username='Mr沈' res = models.User.objects.filter(username='Mr沈') # 返回是一个列表套对象,且对象不存在时,不会报错,返回空列表 user_obj = res.first() # 支持索引取值不支持负索引,但是不建议使用,推荐使用first方法
filter()方法内可以放多个关键字参数, 并且多个关键字参数之间是and关系
res = models.User.objects.filter(username='Mr沈', password='123') # 相当于SQL语句的select * from User where username='Mr沈' and password='123'
2、查找所有
1、filter() 括号中不放任何参数就是查所有
res = models.User.objects.filter()
2、all() 查询所有的数据
res = models.User.objects.all()
3、删除数据
先根据filter过滤出需要删除的数据全部,再用delete() 方法删除
models.User.objects.filter(id=delete_id).delete()
4、数据的修改
1、用户如何获取需要修改的数据id,可以通过让前端get请求中携带数据id来获取
<a href="/edit_user/?edit_id={{ user_obj.id }}">编辑</a>
2、根据数据id对数据进行批量修改,两种方式:
1、方式1:update() 推荐使用
models.User.objects.filter(id=edit_id).update(name=username,password=password)
2、方式2:不推荐使用,因为会将数据库所有的数据重新写一遍,效率很慢
# 方式2(了解) # 1 先获取数据对象 edit_obj = models.User.objects.filter(id=edit_id).first() # 2 再修改对象属性 edit_obj.name = username edit_obj.password = password # 3 调用对象的绑定方法保存 edit_obj.save()
8、
表关系有:一对一,一对多,多对多
在书写表关系的时候,要先把基表在models中全部写出来,之后再考虑外键字段,最后要执行数据库迁移命令
图书表与出版社表:是一对多的外键关键关系,外键字段应该建立在多的那一方,ForeignKey(to= '')
# 书籍与出版社 是一对多外键关系 publish = models.ForeignKey(to='Publish') # 默认关联字段就是出版社表的主键字段 # publish = models.ForeignKey(to=Publish) # to后面也可以直接写表的变量名 但是需要保证该变量名在当前位置的上方出现
图书表与作者表:是多对多的外键关系,外键字段建立在哪张表上都行,外键字段推荐建立在查询频率较高的那张表中,为了方便后面基于ORM查询, ManyToManyField(to= '')
# 书籍与作者 是多对多外键关系 authors = models.ManyToManyField(to='Author') # 书籍和作者是多对多关系 """ authors字段是一个虚拟字段 不会真正的在表中创建出来 只是用来告诉django orm 需要创建书籍和作者的第三张关系表 """
作者表与作者详情表:是一对一的外键关系,外键字段建立在哪张表上都行,推荐建立在查询频率较高的那张表中,为了方便后面基于ORM查询, OneToOneField(to= '')
# 一对一外键关系建立 author_detail = models.OneToOneField(to='AuthorDetail')
注意:ForeignKey字段和OneToOneFiled字段在创建表时不管用户有没有加_ id后缀都会自动在该字段名后加_id
创建多对多表时,会自动创建第三张中间表