Django操作Mysql

一、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  获取当前请求方式
原文地址:https://www.cnblogs.com/yangmeichong/p/11315464.html