Django之数据库操作入门
阅读原文时间:2023年07月08日阅读:1

目录

pycharm连接mysql数据库

  1. pycharm连接数据库,打开配置页面

2. 在配置页面配置数据库连接信息,注意第一次连接需要下载驱动,最后点test connection测试连接通过即可

# 在settings.py中,添加数据库的连接配置(可以配置多个数据库)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
# 修改为(最简单的配置)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',   # 将最后一位改为要连接的数据库类型
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'NAME': 'db1',  # 数据库名称
        'HOST': '192.168.0.2',  # 数据库地址
        'PORT': 3306,   # 数据库连接端口
        'USER': 'root', # 连接数据库用户名
        'PASSWORD': '123',  # 连接数据库密码
        'CHARSET': 'utf8',  # 使用的字符集
    }
}

django连接数据库报错

# django 1.x版本处理:
#    需要在项目或app的__init__.py文件中添加如下配置
import pymysql
pymysql.install_as_MySQLdb()

# django 2.x及以下,可以通过下载mysqlclient模块解决
pip3.8 install mysqlclient

ORM简介

ORM高度封装了SQL语句,在django中使用ORM操作数据库,但有时候会效率较低,需要自己写SQL。

  1. 在models.py模型层创建模型

    class user(models.Model):
    # 创建一个表的主键字段,注意,如果不指定主键字段,ORM会自动帮你创建一个主键字段
    id = models.AutoField(primary_key=True)
    # 创建一个字符字段,最大大小指定为32长度,verbose_name可以增加字段注释
    name = models.CharField(max_length=32, verbose_name='姓名')
    age = models.IntegerField(verbose_name='年龄')

  2. 执行数据库迁移命令

  • 只有执行了数据库迁移命令,django才会在数据库中创建表,并且可以使用ORM操作。

    python manage.py makemigrations # 将操作记录到系统中
    python manage.py migrate # 将操作同步到数据库中

  • 注:在执行完数据库迁移命令后,django也会在数据库中自动创建一些系统表。

    我们继续使用昨天用户注册页面,代码如下:

    <div class="container">
        <div class="row">
            <h1 class="text-center">用户登录</h1>
            <div class="col-md-6 col-md-offset-3">
                <form action="" method="post">
                    {% csrf_token %}
                    <p>username:
                        <input type="text" class="form-control" name="name">
                    </p>
                    <p>password:
                        <input type="text" class="form-control" name="age">
                    </p>
                    <input type="submit" class="btn btn-block btn-success">
                </form>
            </div>
        </div>
    </div>

下面我们使用这个页面进行数据库相关操作

ORM入门之增删改查

  • from app import models
  • models.类名(也就是表名).objects.create(插入数据)
  • models.类名(也就是表名).objects.filter(查询条件).delete()
  • models.类名(也就是表名).objects.filter(查询条件).update(修改内容)
  • models.类名(也就是表名).objects.filter(查询条件)

models.user.objects.create(name=name, age=age)

# 先将需要删除的数据进行筛选出来后,再删除
res = models.user.objects.filter(id=1).delete()
# 返回值为:(1, {'app01.user': 1})
print(res)


# 修改数据需要先将要修改的数据查询出来后,再进行修改.
# 类似于SQL:update user set name = 'Rose' where name='xxx';
res = models.user.objects.filter(name=name).update(name='Rose')
# update的返回值为修改的最后一个值的主键
print(res)


# 使用一个变量接收返回值,返回的结果为一个QuerySet,数据套字典的格式。
res = models.user.objects.filter(name=name)  # <QuerySet [<user: user object (1)>, <user: user object (2)>]>
# 如果想要查看QuerySet中的值时,可以使用以下方式操作
print(res[0].name)
print(res[0].age)

练习:简单实现注册登录功能

模型层models

class register(models.Model):
    username = models.CharField(max_length=32, verbose_name='用户名')
    password = models.CharField(max_length=800, verbose_name='用户密码')

路由层urls

    path('register/', views.register_func),
    # 登录页面
    path('login/', views.login_func),

视图层

def register_func(request):
    if request.method == 'POST':
        # 接收前台传入的数据
        name = request.POST.get('name')
        pwd = request.POST.get('pwd')
        confirm_pwd = request.POST.get('confirm_pwd')
        if name and pwd and confirm_pwd:
            db_username = models.register.objects.filter(username=name)
            if db_username:
                return HttpResponse('用户名已存在')
            elif pwd == confirm_pwd and name:
                md5 = hashlib.md5()
                md5.update('ChinaPost'.encode('utf8'))
                md5.update(pwd.encode('utf8'))
                md5_pwd = md5.hexdigest()
                models.register.objects.create(username=name, password=md5_pwd)
                return HttpResponse('注册成功')
            else:
                return HttpResponse('两次密码不一致')
        else:
            return HttpResponse('用户名或密码不能为空')
    return render(request, 'login.html')

# 简单的登录功能
def login_func(request):
    # 验证是否是post请求
    if request.method == 'POST':
        # 接收前端用户名密码
        name = request.POST.get('name')
        pwd = request.POST.get('pwd')
        # 判断用户名或密码是否为空
        if name and pwd:
            # 从数据库中取数进行比对
            db_name = models.register.objects.filter(username = name)
            # 对密码进行加密
            md5 = hashlib.md5()
            md5.update('ChinaPost'.encode('utf8'))
            md5.update(pwd.encode('utf8'))
            md5_pwd = md5.hexdigest()
            # 判断用户名与密码是否一致
            if db_name:
                if db_name[0].password == md5_pwd:
                    return HttpResponse('登录成功')
                else:
                    return HttpResponse('用户名或密码错误')
            else:
                return HttpResponse('用户名或密码错误')
        else:
            # 如果用户名或密码为空,则返回错误
            return HttpResponse('错误!用户名或密码不可以为空')
    return render(request, 'login.html')

前端-注册页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.css' %}">
    <script src="{% static 'bootstrap-3.4.1-dist/js/bootstrap.js' %}"></script>
    <script src="{% static 'jQuery.js' %}"></script>
</head>
<body>
    <div class="container">
        <div class="row">
            <h1 class="text-center">用户登录</h1>
            <div class="col-md-6 col-md-offset-3">
                <form action="" method="post">
                    {% csrf_token %}
                    <p>username:
                        <input type="text" class="form-control" name="name">
                    </p>
                    <p>password:
                        <input type="password" class="form-control" name="pwd">
                    </p>
                    <p>confirm_password
                        <input type="password" class="form-control" name="confirm_pwd">
                    </p>
                    <input type="submit" class="btn btn-block btn-success">
                </form>
            </div>
        </div>
    </div>
</body>>
</html>

前端登录页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.css' %}">
    <script src="{% static 'bootstrap-3.4.1-dist/js/bootstrap.js' %}"></script>
    <script src="{% static 'font-awesome-4.7.0/css/font-awesome.css' %}"></script>
    <script src="{% static 'jQuery.js' %}"></script>
</head>
<body>
    <div class="container">
        <h1 class="text-center">用户登录</h1>
        <div class="row">
            <div class="col-md-6 col-md-offset-3">
                <form action="" method="post">
                    {% csrf_token %}
                    <p>用户名
                        <input type="text" class="form-control" name="name">
                    </p>
                    <p>密码
                        <input type="password" class="form-control" name="pwd">
                    </p>
                    <input type="submit" class="btn btn-success btn-block">
                </form>
            </div>
        </div>
    </div>
</body>
</html>

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器