当前位置:   article > 正文

Django之操作MySQL_django mysql

django mysql

一、主要文件介绍

-mysite项目文件夹

    --mysite文件夹

        ---settings.py        配置文件

        ---urls.py              路由与视图函数对应关系(路由层)

        ---wsgi.py             wsgiref模块

    --manage.py            django的入口文件

    --db.sqlite3               django自带的sqlite3数据库(小型数据库 功能不是很多还有bug)

    --templates                html文件存放文件夹

    --static                      存放静态文件

        ---css

        ---js

        ---img

        其他第三方文件

    --app01文件夹

        ---admin.py           django后台管理

        ---apps.py             注册使用

        ---migrations文件夹        数据库迁移记录

        ---models.py         数据库相关的 模型类(orm)

        ---tests.py             测试文件

        ---views.py            视图函数(视图层)

二、settings.py配置文件

  1. INSTALLED_APPS # 注册的app
  2. MIDDLEWARE # django中间件
  3. TEMPLATES # html文件存放路径配置
  4. DATABASES # 项目指定的数据库
  5. LANGUAGE_CODE = 'en-us' # 文字编码
  6. TIME_ZONE = 'UTC' # 时间
  7. APPEND_SLASH = False # 取消url自动加斜杠 默认是True
  8. STATIC_URL = 'static/' # 类似于访问静态文件的令牌
  9. """如果你想要访问静态文件 你就必须以static开头"""
  10. STATICFILES_DIRS = [ # 静态文件配置
  11. os.path.join(BASE_DIR, "static"),
  12. ]
  13. # django链接MySQL
  14. # 1.配置文件中配置
  15. DATABASES = {
  16. 'default': {
  17. 'ENGINE': 'django.db.backends.mysql',
  18. 'NAME': 'data',
  19. 'USER': 'root',
  20. 'PASSWORD': '123123',
  21. 'HOST': '127.0.0.1',
  22. 'PORT': 3306,
  23. 'CHARSET': 'utf8'
  24. }
  25. }
  26. # 2.在项目名下的init或任意的应用名下的init文件中书写以下代码即可
  27. import pymysql
  28. pymysql.install_as_MySQLdb()

三、urls.py

  1. from app01 import views
  2. urlpatterns = [
  3. path('admin/', admin.site.urls),
  4. path('index/', views.index), # 路由匹配
  5. path('login/', views.login), # 登录功能
  6. path('register/', views.reg), # 注册功能
  7. path('userlist/', views.userlist), # 展示用户列表
  8. path('edit_user/', views.edit_user, name='xxx'), # 编辑用户 name起别名做反向解析
  9. # 反向解析前端<a href="{% url 'xxx' %}?user_id={{ user_obj.id }}" class="btn btn-primary btn-xs">编辑</a>
  10. # 反向解析后端 from django.shortcuts import reverse reverse('xxx')
  11. path('delete_user/', views.delete_user), # 删除用户
  12. ]

四、views.py

  1. from django.shortcuts import render, HttpResponse, redirect
  2. def index(request):
  3. # django小白必会三板斧(render, HttpResponse, redirect)
  4. # return HttpResponse("hello world") # 返回字符串类型的数据
  5. # return render(request, 'index.html') # 返回html文件 自动去templates文件夹下查找文件
  6. # return redirect('https://www.baidu.com') # 跳转别人的网址
  7. # return redirect('/login') # 跳转自己的网址
  8. # 模板语法
  9. user_dict = {'username': 'zhangsan', 'age': 100}
  10. # 第一种传值方式:更加的精确 节省资源
  11. # return render(request, 'index.html', {'user_dict': user_dict})
  12. # 第二种传值方式:当你要传的数据特别多的时候
  13. """locals会将所有在名称空间所有的名字全部传递给html页面"""
  14. return render(request, 'index.html', locals())
  15. def login(request):
  16. return HttpResponse('login')
  1. # request对象方法:
  2. request.method # 返回请求方式 并且是全大写的字符串形式
  3. request.POST # 获取用户提交的post请求数据(不包含文件) < QueryDict: {'username': ['zs'], 'password': ['123']} >
  4. request.POST.get() # 只获取列表最后一个元素
  5. request.POST.getlist() # 直接将列表取出
  6. request.GET # 获取用户提交的get请求数据 get请求携带的数据的大小限制4kb左右而post请求则没有限制
  7. request.GET.get() # 只获取列表最后一个元素
  8. request.GET.getlist() # 直接将列表取出
  9. request.FILES # 获取文件数据
  10. request.path # /login/
  11. request.path_info # /login/
  12. request.get_full_path() # /login/?username=zhangsan/
  13. # models操作数据库
  14. models.User.objects.create(username=username, password=password) # 增
  15. models.User.objects.filter(id=delete_id).delete() # 删
  16. models.User.objects.filter(id=edit_id).update(username=username, password=password) # 改
  17. user_queryset = models.User.objects.all() # 查
  1. app01 import models
  2. def login(request):
  3. if request.method == 'POST':
  4. # 获取用户提交的数据
  5. username = request.POST.get('username')
  6. password = request.POST.get('password')
  7. # 查询数据库数据
  8. user_obj = models.User.objects.filter(username=username).first() # select * from user where username='zero';
  9. # print(user_obj) # <QueryDict: {'username': ['zero'], 'password': ['123']}>
  10. if user_obj:
  11. if password == user_obj.password:
  12. return HttpResponse("登录成功")
  13. else:
  14. return HttpResponse("密码错误")
  15. else:
  16. return HttpResponse("用户不存在")
  17. return render(request, 'login.html')
  1. def reg(request):
  2. if request.method == 'POST':
  3. username = request.POST.get('username')
  4. password = request.POST.get('password')
  5. # 第一种方法:数据库的增加
  6. # 直接获取用户数据存入数据库
  7. # res = models.User.objects.create(username=username, password=password)
  8. # print(res, res.username, res.password)
  9. # 第二种方法:数据库的增加
  10. user_obj = models.User(username=username, password=password)
  11. user_obj.save() # 保存数据
  12. return render(request, 'reg.html')
'
运行
  1. def userlist(request):
  2. # 查询出用户表里面的所有数据
  3. # 方式一
  4. # data = models.User.objects.filter() # select * from user
  5. # print(data)
  6. # 方式二
  7. user_queryset = models.User.objects.all()
  8. return render(request, 'userlist.html', locals())
'
运行
  1. def edit_user(request):
  2. # 获取url问号后面的参数
  3. edit_id = request.GET.get('user_id')
  4. # 查询当前用户想要编辑的数据对象
  5. edit_obj = models.User.objects.filter(id=edit_id).first()
  6. if request.method == 'POST':
  7. username = request.POST.get('username')
  8. password = request.POST.get('password')
  9. # 去数据库中修改对应的内容
  10. # 修改数据方式一
  11. models.User.objects.filter(id=edit_id).update(username=username, password=password)
  12. # 修改数据方式二
  13. # edit_obj.username = username
  14. # edit_obj.password = password
  15. # edit_obj.save()
  16. # 跳转到数据的展示页面
  17. return redirect('/userlist/')
  18. # 将数据对象展示到页面上
  19. return render(request, 'edit_user.html', locals())
'
运行
  1. def delete_user(request):
  2. # 获取用户想要删除的数据id值
  3. delete_id = request.GET.get('user_id')
  4. # 直接去数据库中找到对应的数据删除即可
  5. models.User.objects.filter(id=delete_id).delete()
  6. return redirect('/userlist/')
'
运行

五、Django ORM models.py

  1. """
  2. ROM:对象关系映射
  3. 作用:通过pythom面向对象的代码简单快捷的操作数据库
  4. 不足之处:封装程度太高 有时候sql语句的效率偏低 需要自己写SQL语句
  5. 数据库迁移命令:
  6. python manage.py makemigrations
  7. python manage.py migrate
  8. 创建项目命令:startapp app02
  9. """
  10. from django.db import models
  11. class User(models.Model):
  12. """
  13. 创建模型表的时候如果主键字段名没有额外的叫法(默认id) 那么主键字段可以省略不写
  14. max_length:字段长度
  15. verbose_name:用来对字段的解释
  16. null=True:该字段可以为空
  17. default=18:默认值
  18. """
  19. username = models.CharField(max_length=32, verbose_name='用户名') # username varchar(32)
  20. # password = models.IntegerField() # password int
  21. # 字段的修改
  22. password = models.CharField(max_length=32) # password int
  23. # 字段的增加
  24. age = models.IntegerField(default=18)
  1. # 创建表关系
  2. class Book(models.Model):
  3. title = models.CharField(max_length=32)
  4. price = models.DecimalField(max_digits=8, decimal_places=2)
  5. publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE) # 一对多 默认就是与Publish表的主键字段做外键关联 on_delete=models.CASCADE级联删除
  6. authors = models.ManyToManyField(to='Author') # 多对多 ManyToManyField会自动创建第三张表
  7. class Publish(models.Model):
  8. name = models.CharField(max_length=32)
  9. addr = models.CharField(max_length=32)
  10. class Author(models.Model):
  11. name = models.CharField(max_length=32)
  12. age = models.IntegerField()
  13. author_detail = models.OneToOneField(to='AuthorDetail', on_delete=models.CASCADE) # 一对一
  14. class AuthorDetail(models.Model):
  15. phone = models.BigIntegerField()
  16. addr = models.CharField(max_length=32)

六、templates

1.index.html

  1. {{ user_dict }} # 模板语法
  2. {% load static %} # 静态文件动态解析
  3. <link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet">

2.login.html

  1. <h1 class="text-center">登录功能</h1>
  2. <div class="container">
  3. <div class="row">
  4. <div class="col-md-8 col-md-offset-2">
  5. <form action="" method="post">
  6. <p>username:<input type="text" name="username" class="form-control"></p>
  7. <p>password:<input type="password" name="password" class="form-control"></p>
  8. <input type="submit" class="btn btn-success btn-block">
  9. </form>
  10. </div>
  11. </div>
  12. </div>

3.reg.html

  1. <h1 class="text-center">注册功能</h1>
  2. <div class="container">
  3. <div class="row">
  4. <div class="col-md-8 col-md-offset-2">
  5. <form action="" method="post">
  6. <p>username:<input type="text" name="username" class="form-control"></p>
  7. <p>password:<input type="password" name="password" class="form-control"></p>
  8. <input type="submit" class="btn btn-danger btn-block">
  9. </form>
  10. </div>
  11. </div>
  12. </div>

4.userlist

  1. <h1 class="text-center">数据展示</h1>
  2. <div class="container">
  3. <div class="row">
  4. <div class="col-md-8 col-md-offset-2">
  5. <table class="table table-striped table-hover">
  6. <thead>
  7. <tr>
  8. <th>ID</th>
  9. <th>username</th>
  10. <th>password</th>
  11. <th>action</th>
  12. </tr>
  13. </thead>
  14. <tbody>
  15. {% for user_obj in user_queryset %}
  16. <tr>
  17. <td>{{ user_obj.id }}</td>
  18. <td>{{ user_obj.username }}</td>
  19. <td>{{ user_obj.password }}</td>
  20. <td>
  21. <a href="{% url 'xxx' %}?user_id={{ user_obj.id }}" class="btn btn-primary btn-xs">编辑</a>
  22. <a href="/delete_user/?user_id={{ user_obj.id }}" class="btn btn-danger btn-xs">删除</a>
  23. </td>
  24. </tr>
  25. {% endfor %}
  26. </tbody>
  27. </table>
  28. </div>
  29. </div>
  30. </div>

5.edit_user.html

  1. <h1 class="text-center">编辑功能</h1>
  2. <div class="container">
  3. <div class="row">
  4. <div class="col-md-8 col-md-offset-2">
  5. <form action="" method="post">
  6. <p>username:<input type="text" name="username" class="form-control" value="{{ edit_obj.username }}"></p>
  7. <p>password:<input type="text" name="password" class="form-control" value="{{ edit_obj.password }}"></p>
  8. <input type="submit" class="btn btn-info btn-block" value="编辑">
  9. </form>
  10. </div>
  11. </div>
  12. </div>

七、django请求生命周期流程图

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/808781
推荐阅读
相关标签
  

闽ICP备14008679号