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配置文件

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

三、urls.py

from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.index),  # 路由匹配
    path('login/', views.login),  # 登录功能
    path('register/', views.reg),  # 注册功能
    path('userlist/', views.userlist),  # 展示用户列表
    path('edit_user/', views.edit_user, name='xxx'),  # 编辑用户 name起别名做反向解析
    # 反向解析前端编辑
    # 反向解析后端 from django.shortcuts import reverse    reverse('xxx')
    path('delete_user/', views.delete_user),  # 删除用户
]

四、views.py

from django.shortcuts import render, HttpResponse, redirect

def index(request):
    # django小白必会三板斧(render, HttpResponse, redirect)
    # return HttpResponse("hello world")  # 返回字符串类型的数据
    # return render(request, 'index.html')  # 返回html文件 自动去templates文件夹下查找文件
    # return redirect('https://www.baidu.com')  # 跳转别人的网址
    # return redirect('/login')  # 跳转自己的网址

    # 模板语法
    user_dict = {'username': 'zhangsan', 'age': 100}
    # 第一种传值方式:更加的精确 节省资源
    # return render(request, 'index.html', {'user_dict': user_dict})
    # 第二种传值方式:当你要传的数据特别多的时候
    """locals会将所有在名称空间所有的名字全部传递给html页面"""
    return render(request, 'index.html', locals())

def login(request):
    return HttpResponse('login')
# request对象方法:
request.method    # 返回请求方式 并且是全大写的字符串形式
request.POST  # 获取用户提交的post请求数据(不包含文件) < QueryDict: {'username': ['zs'], 'password': ['123']} >
    request.POST.get()    # 只获取列表最后一个元素
    request.POST.getlist()    # 直接将列表取出
request.GET  # 获取用户提交的get请求数据 get请求携带的数据的大小限制4kb左右而post请求则没有限制
    request.GET.get()    # 只获取列表最后一个元素
    request.GET.getlist()    # 直接将列表取出
request.FILES  # 获取文件数据
request.path  # /login/
request.path_info  # /login/
request.get_full_path()  # /login/?username=zhangsan/

# models操作数据库
models.User.objects.create(username=username, password=password)  # 增
models.User.objects.filter(id=delete_id).delete()  # 删
models.User.objects.filter(id=edit_id).update(username=username, password=password)  # 改
user_queryset = models.User.objects.all()  # 查
app01 import models
def login(request):
    if request.method == 'POST':
        # 获取用户提交的数据
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 查询数据库数据
        user_obj = models.User.objects.filter(username=username).first()  # select * from user where username='zero';
        # print(user_obj)  # 
        if user_obj:
            if password == user_obj.password:
                return HttpResponse("登录成功")
            else:
                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.User.objects.create(username=username, password=password)
        # print(res, res.username, res.password)
        # 第二种方法:数据库的增加
        user_obj = models.User(username=username, password=password)
        user_obj.save()  # 保存数据
    return render(request, 'reg.html')
def userlist(request):
    # 查询出用户表里面的所有数据
    # 方式一
    # data = models.User.objects.filter()  # select * from user
    # print(data)
    # 方式二
    user_queryset = models.User.objects.all()

    return render(request, 'userlist.html', locals())
def edit_user(request):
    # 获取url问号后面的参数
    edit_id = request.GET.get('user_id')
    # 查询当前用户想要编辑的数据对象
    edit_obj = models.User.objects.filter(id=edit_id).first()
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 去数据库中修改对应的内容
        # 修改数据方式一
        models.User.objects.filter(id=edit_id).update(username=username, password=password)
        # 修改数据方式二
        # edit_obj.username = username
        # edit_obj.password = password
        # edit_obj.save()
        # 跳转到数据的展示页面
        return redirect('/userlist/')
    # 将数据对象展示到页面上
    return render(request, 'edit_user.html', locals())
def delete_user(request):
    # 获取用户想要删除的数据id值
    delete_id = request.GET.get('user_id')
    # 直接去数据库中找到对应的数据删除即可
    models.User.objects.filter(id=delete_id).delete()
    return redirect('/userlist/')

五、Django ORM models.py

"""
ROM:对象关系映射
作用:通过pythom面向对象的代码简单快捷的操作数据库
不足之处:封装程度太高 有时候sql语句的效率偏低 需要自己写SQL语句
数据库迁移命令:
    python manage.py makemigrations
    python manage.py migrate
创建项目命令:startapp app02
"""
from django.db import models

class User(models.Model):
    """
    创建模型表的时候如果主键字段名没有额外的叫法(默认id) 那么主键字段可以省略不写
    max_length:字段长度
    verbose_name:用来对字段的解释
    null=True:该字段可以为空
    default=18:默认值
    """
    username = models.CharField(max_length=32, verbose_name='用户名')  # username varchar(32)
    # password = models.IntegerField()  # password int
    # 字段的修改
    password = models.CharField(max_length=32)  # password int
    # 字段的增加
    age = models.IntegerField(default=18)
# 创建表关系
class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8, decimal_places=2)
    publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE)  # 一对多 默认就是与Publish表的主键字段做外键关联 on_delete=models.CASCADE级联删除
    authors = models.ManyToManyField(to='Author')  # 多对多 ManyToManyField会自动创建第三张表

class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=32)

class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    author_detail = models.OneToOneField(to='AuthorDetail', on_delete=models.CASCADE)  # 一对一

class AuthorDetail(models.Model):
    phone = models.BigIntegerField()
    addr = models.CharField(max_length=32)

六、templates

1.index.html

{{ user_dict }}    # 模板语法

{% load static %}    # 静态文件动态解析

2.login.html

登录功能

username:

password:

3.reg.html

注册功能

username:

password:

4.userlist

数据展示

{% for user_obj in user_queryset %} {% endfor %}
ID username password action
{{ user_obj.id }} {{ user_obj.username }} {{ user_obj.password }} 编辑 删除

5.edit_user.html

编辑功能

username:

password:

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

Django之操作MySQL_第1张图片

你可能感兴趣的:(python后端,django,python,后端)