一、django链接mysql
db.sqlite3是django自带的一个小数据库,支持的功能不是很多,对日期格式也不是很敏感
如果想改成mysql就需要将settings.py中DATABASES这段进行修改
# 第一步修改
# 默认 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } # 修改为mysql DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', } 'NAME': 'test', 'USER':'root', 'PASSWORD':'123', 'HOST':'127.0.0.1', 'PORT':3306, 'CHARSET':'utf8' }
# 第二步修改
去应用名下的__init__.py或者项目名下的__init__.py文件中 告诉django不要使用默认的mysqld_db模块连接mysql而是使用pymysql
import pymysql
pymysql.install_as_MySQLdb()
二、Django ORM简介
# 对象关系映射 类 >>> 数据库的表 对象 >>> 数据库里面的一条条的表记录 对象点属性 >>> 表记录的某个字段对应的值 ps: 优点:能够让一个不会数据库操作的人 也能够通过编程语言轻松的操作数据库 缺点:有时候sql语句的查询效率可能偏低
注意事项
1.orm 建表
django orm 注意事项 django orm不会帮你自动创建库 只能帮你自动创建表 1.models.py中写模型类
class User(models.Model):
# id int primary_key # django orm在你没有指定逐渐字段的时候,会自动帮你建一个id为主键的字段,如果名字要叫其它的需要自建
# uid = models.AutoField(primary_key=True)
# username varchar(32)
username = models.CharField(max_length=32)
password = models.CharField(max_length=32)
2.执行数据库迁移(同步)命令
python3 manage.py makemigrations 将数据的更改操作记录到小本本上,以便查询操作记录
python3 manage.py migrate 将更改真正同步到数据库
执行后可以看到:migrations目录中会有一个001_initial.py文件记录你的操作
执行第二条命令后可以看到:数据库创建了很多的表,而我们要用到的表名变成了:应用名.user 例:app01.user
并且那些多出来的表不能删除
2.orm 查询数据库
# login.html页面 # 前端登录页面body内容 <div class="container"> <h2>登录页面</h2> <div class="row"> <div class="col-md-8 col-md-offset-2"> <form action="" method="post"> <p>username:<input type="text" class="form-control" name="username"></p> <p>password:<input type="password" class="form-control" name="password"></p> <input type="submit" class="btn btn-success pull-right"> </form> </div> </div> </div> # views.py操作 def login(request): print(request.method) # 获取当前请求方式 if request.method == 'POST': # 获取post请求提交的数据 print(request.POST) username = request.POST.get('username') # <QueryDict: {'username': ['simon'], 'password': ['123']}> password = request.POST.get('password') # user_obj = models.User.objects.filter(username=username)[0] # select id,username,password from user where username='jason' # 不推荐索引取值,索引只能用正向索引,不支持负数索引
user_obj = models.User.objects.filter(username=username).first() # 推荐使用first获取对象
# user_obj = models.User.objects.filter(username=username) # user_obj.query可以查询到具体运行的sql语句;只有queryset对象才可以点query查看对应的语句
# print(user_obj.query) # SELECT `app01_user`.`id`, `app01_user`.`username`, `app01_user`.`password` FROM `app01_user` WHERE `app01_user`.`username` = simon
print(user_obj)
print(user_obj.id) print(user_obj.pk) # pk会自动查找当前对象的主键字段 print(user_obj.username) print(user_obj.password) """ filter 方法: """ return render(request,'login.html') POST <QueryDict: {'username': ['simon'], 'password': ['123']}> User object (1) 1 1 simon 123
# views.py中login.py和前端页面输入的账号密码进行比对
# views.py中login函数定义 def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') is_alive = models.User.objects.filter(username=username,password=password) # filter支持传多个参数,并且是and的关系 # select id,username,password from user where username='simon' and password = '123' if is_alive: return HttpResponse("登录成功") return HttpResponse("登录失败") # 请求登录之后可以看到:账号密码正确,登录成功;不正确就失败
3.表字段的增删改
# user表新增字段addr,email # modles.py class User(models.Model): username = models.CharField(max_length=32) password = models.CharField(max_length=32) addr = models.CharField(max_length=32,default='null') # 只要修改了models.py中跟数据库相关的数据,必须重新执行数据库的2条同步命令; null=True该字段可以为空 email = models.CharField(max_length=32,null=True) # 删除字段email 只需要将刚增加的email这行注销掉,重新执行同步命令就可以了(正式服不建议,一定要小心) # 修改字段 username = models.CharField(max_length=64) 将之前有的哪行需要修改的地方修改一次后,执行同步命令
4.表数据的增删改查
# 数据新增 # 注册页面 # register.html前端页面 # body内容 <div class="container"> <div class="row"> <div class="col-md-6 col-md-offset-2"> <h2 class="text-center">注册页面</h2> <form action="" method="post"> <p>username:<input type="text" class="form-control" name="username"></p> <p>password:<input type="password" class="form-control" name="password"></p> <p>addr<input type="text" class="form-control" name="addr"></p> <input type="submit" class="btn btn-success pull-right"> </form> </div> </div> </div> # urls.py新增一条 path('register/', views.register), # views.py新增register函数
def register(request):
if request.method == "POST":
username = request.POST.get('username')
password = request.POST.get('password')
addr = request.POST.get('addr')
# orm创建数据
# 第一种方式:推荐
models.User.objects.create(username=username,password=password,addr=addr)
# 第二种方式
# user_obj = models.User() # 实例化产生对象
# user_obj.username = username
# user_obj.password = password
# user_obj.addr = addr
# user_obj.save() # 保存到数据库
return redirect('/user_list')
return render(request,'register.html')
# 运行后进行注册,可以看到新增的数据
5.数据查询
# 数据查询 # views.py def user_list(request): # 获取表所有的数据 data = models.User.objects.all() # select id,username,password,addr from user; # print(data) # <QuerySet [<User: User object (1)>, <User: User object (2)>, <User: User object (3)>]> # return render(request,'list.html',{'data':data}) # 第一种给页面传值的方式:写字典 return render(request,'list.html',locals()) # 会将当前名称空间中的所有名字都传递给前端页面
6.数据修改
# 修改编辑 基于已经存在了的数据进行修改 # 思路 先将用户想要修改的数据查询出来 并且展示给用户看 用户修改完之后发送post请求,后端修改数据 # urls.py新增一条 path('edit/', views.edit), # views.py 增加edit函数 def edit(request): if request.method == "POST": edit_id = request.GET.get('id') username = request.POST.get('username') password = request.POST.get('password') addr = request.POST.get('addr') # queryset对象,可以直接调用update方法进行批量更新;如果queryset对象中有多个数据对象,那么会将多个数据对象全部更新 # 第一种更新方式:针对修改的字段进行更新 models.User.objects.filter(pk=edit_id).update(username=username,password=password,addr=addr) # 第二种更新方式:不推荐,会将所有字段更新一遍,效率低 # edit_obj = models.User.objects.filter(pk=edit_id).first() # edit_obj.username = username # edit_obj.password = password # edit_obj.addr = addr # edit_obj.save() # 数据保存 return redirect('/user_list') # print(request.GET) # 获取GET请求携带的参数 edit_id = request.GET.get('id') # 查询该主键对应的数据 edit_obj = models.User.objects.filter(pk=edit_id).first() # 前端修改 # body内容 <div class="container"> <div class="row"> <div class="col-md-6 col-md-offset-2"> <h2 class="text-center">编辑</h2> <form action="" method="post"> <p>username:<input type="text" class="form-control" name="username" value="{{ edit_obj.username }}"></p> <p>password:<input type="password" class="form-control" name="password" value="{{ edit_obj.password }}"></p> <p>addr<input type="text" class="form-control" name="addr" value="{{ edit_obj.addr }}"></p> <input type="submit" class="btn btn-success pull-right" value="修改"> </form> </div> </div> </div>
7.数据删除
# views.py def delete(request): delete_id = request.GET.get('id') models.User.objects.filter(pk=delete_id).delete() # 批量删除 return redirect('/user_list')
8.总结:
数据的增删改查 增 1.create() modeles.User.objects.create(kwargs) create方法会返回当前所创建的数据对象(*****),返回simon 2.对象.save() user_obj = models.User() user_obj.username = 'simon' user_obj.save() # 数据保存 删 queryset对象.delete() 改 1.update() models.User.objects.filter(kwargs).update() 批量更新 2.对象.save() user_obj = models.User(kwargs) user_obj.username = 'jason' user_obj.save() 效率较低 查 1.all() 查所有 不需要传参数 2.filter(kwargs) 结构是一个queryset对象 你可以把它看成一个列表里面是一个个的数据对象
四、Django请求生命周期
request.GET 获取get请求携带的参数
request.POST 获取post请求携带的参数
上面两者在用get取值的时候 默认取列表最后一个元素
如果想整体取用getlist
request.method 获取当前请求方式