yangmeichong

一、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  获取当前请求方式

分类:

技术点:

相关文章:

  • 2021-12-03
  • 2021-09-03
  • 2022-01-07
  • 2021-09-01
  • 2021-07-06
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-11-23
  • 2021-09-14
  • 2022-01-11
  • 2021-06-08
  • 2021-06-05
  • 2021-05-04
  • 2022-12-23
相关资源
相似解决方案