heniancheng 2020-05-26
pycharm链接数据库的方法
参照上课视频即可
‘‘‘ 修改前 DATABASES = { ‘default‘: { ‘ENGINE‘: ‘django.db.backends.sqlite3‘, ‘NAME‘: os.path.join(BASE_DIR, ‘db.sqlite3‘), } } ‘‘‘ # 修改后 DATABASES = { ‘default‘: { ‘ENGINE‘: ‘django.db.backends.mysql‘, ‘NAME‘: ‘practice‘, ‘USER‘:‘root‘, ‘PASSWORD‘:‘1026‘, ‘HOST‘:‘127.0.0.1‘, ‘PORT‘:3306, ‘CHARSET‘:‘utf8‘, } }
django默认用的是mysqldb模块链接MySQL,但是该模块的兼容性不好,需要手动改为pymysql链接,需要告诉django不要用默认的mysqldb改为用pymysql
# 在项目名下的migrations文件夹的__init__.py文件或者任意的应用下的__init__.py文件中书写一下代码 import pymysql pymysql.install_as_MySQLdb()
类 | 表 |
---|---|
对象 | 记录 |
对象属性 | 记录中某个字段对应的值 |
from django.db import models # Create your models here. class Info(models.Model): # id int primary key auto increment id = models.AutoField(primary_key=True,verbose_name=id) # username varchar(32) username = models.CharField(max_length=32,verbose_name=username) # password int password = models.IntegerField(verbose_name=‘password‘) # 此时并未在数据库中产生任何数据
只要修改了models.py中跟数据库相关的代码,就必须执行下述两条数据库迁移命令
python manage.py makemigrations // 将数据记录在小本本上(migrations文件夹中会产生一个文件) python manage.py migrate // 将操作真正的同步到数据库中
- CharFiled必须指定max_length()参数,不指定会报错 - verbose_name参数是所有字段都有的,就是用来对字段的解释 - 由于一张表中必须要有一个主键字段,并且一般情况下都叫id字段,所以orm当你不定义主键字段的时候,orm会自动帮忙创建一个名为id的主键字段,因此,后续在创建模型表的时候入喉主键字段名没有额外的叫法,那么主键字段可以省略不写
gender = models.CharField(max_length=32,null=True)
hobby = models.CharField(max_length=32,default=‘study‘)
直接修改代码,然后执行数据库迁移命令即可
直接注释对应的字段然后执行数据库迁移的命令即可 注意:执行完毕后,字段对应的数据也都没有了,所以,再操作models.py的时候一定要细心,不要随便注释数据,执行迁移命令之前最好检查自己的代码
def login(request): if request.method == ‘POST‘: username = request.POST.get(‘username‘) password = request.POST.get(‘password‘) # models.Info.objects.filter(username=username)得到的是列表套数据对象的格式,支持索引取值,但是不推荐,而且不支持负数索引 user_obj = models.Info.objects.filter(username=username).first() if user_obj: if password == user_obj.password: return HttpResponse(‘登陆成功‘) return HttpResponse(‘密码错误‘) else: return HttpResponse(‘用户名不存在‘) return render(request,‘login.html‘)
# 获取所有用户信息展示到前端 def user_info(request): # 方式一 # data = models.Info.objects.filter() # 方式二 data = models.Info.objects.all() return render(request,‘user_info.html‘,locals())
def reg(request): if request.method == ‘POST‘: username = request.POST.get(‘username‘) password = request.POST.get(‘password‘) res = models.Info.objects.create(username=username,password=password) ‘‘‘ 也可以使用下述代码增加 user_obj = models.Info(username=username,password=password) user_obj.save() ‘‘‘ return render(request,‘register.html‘)
需求:点击前端的编辑按钮,然后修改对用的数据 问题:如何告诉后端用户想要编辑哪条数据 将编辑按钮所在哪一行数据的主键值发送给后端,利用url问号后面携带参数的方式
def modify(request): # 获取url问号后面的参数 edit_id = request.GET.get(‘user_id‘) # 获取当前用户想要修改的数据对象 edit_obj = models.Info.objects.filter(id=edit_id).first() if request.method == ‘POST‘: # 获取用户输入的新数据 username = request.POST.get(‘username‘) password = request.POST.get(‘password‘) # 去数据库修改对应的数据内容---方式1 # 将filter查询出来的列表中所有的对象全部更新,批量更新操作,只修改被修改的字段 models.Info.objects.filter(id=edit_id).update(username=username,password=password) ‘‘‘ 修改数据方式2 edit_obj.username = username edit_obj.password= password edit_obj.save() 上述方法当字段特别多的时候效率会非常的低 从头到尾将数据的所有字段全部更新一边 无论该字段是否被修改 ‘‘‘ # 修改完跳回展示数据页面 return redirect(‘/user_info/‘) else: # 展示修改信息的页面 return render(request,‘modify_info.html‘,locals())
def delete_info(request): # 获取用户想删除的数据的id值 edit_id = request.GET.get(‘user_id‘) # 直接去数据库找到对应的数据删除即可 models.Info.objects.filter(id=edit_id).delete() # 删除后跳回到展示数据页面 return redirect(‘/user_info/‘) ‘‘‘ 真正的删除功能应该需要二次确认 我们这里先不做后面会讲 删除数据内部其实并不是真正的删除 我们会给数据添加一个标识字段用来表示当前数据是否被删除了,如果数据被删了仅仅只是讲字段修改一个状态 ‘‘‘
urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^login/‘,views.login), url(r‘^reg/‘,views.reg), url(r‘^user_info/‘,views.user_info), url(r‘^modify/‘,views.modify), url(r‘^delete/‘,views.delete_info), ]
from django.shortcuts import render,HttpResponse,redirect from app01 import models # Create your views here. # 登陆 def login(request): if request.method == ‘POST‘: username = request.POST.get(‘username‘) password = request.POST.get(‘password‘) user_obj = models.Info.objects.filter(username=username).first() # 得到的是列表套数据对象的格式 if user_obj: if password == user_obj.password: return HttpResponse(‘登陆成功‘) return HttpResponse(‘密码错误‘) else: return HttpResponse(‘用户名不存在‘) return render(request,‘login.html‘) # 注册 def reg(request): if request.method == ‘POST‘: username = request.POST.get(‘username‘) password = request.POST.get(‘password‘) res = models.Info.objects.create(username=username,password=password) return render(request,‘register.html‘) # 获取所有用户信息展示到前端 def user_info(request): # 方式一 # data = models.Info.objects.filter() # 方式二 data = models.Info.objects.all() return render(request,‘user_info.html‘,locals()) # 修改数据库信息 def modify(request): # 获取url问号后面的参数 edit_id = request.GET.get(‘user_id‘) # 获取当前用户想要修改的数据对象 edit_obj = models.Info.objects.filter(id=edit_id).first() if request.method == ‘POST‘: # 获取用户输入的新数据 username = request.POST.get(‘username‘) password = request.POST.get(‘password‘) # 去数据库修改对应的数据内容 models.Info.objects.filter(id=edit_id).update(username=username,password=password) # 修改完跳回展示数据页面 return redirect(‘/user_info/‘) else: # 展示修改信息的页面 return render(request,‘modify_info.html‘,locals()) # 删除数据库信息 def delete_info(request): # 获取用户想删除的数据的id值 edit_id = request.GET.get(‘user_id‘) # 直接去数据库找到对应的数据删除即可 models.Info.objects.filter(id=edit_id).delete() # 删除后跳回到展示数据页面 return redirect(‘/user_info/‘) ‘‘‘ 真正的删除功能应该需要二次确认 我们这里先不做后面会讲 删除数据内部其实并不是真正的删除 我们会给数据添加一个标识字段用来表示当前数据是否被删除了,如果数据被删了仅仅只是讲字段修改一个状态 ‘‘‘