4.Django的数据模型

176 阅读4分钟

Python 的数据模型

Model 用于和关系型数据库交互

1. 要实现的数据表结构如下

  • 书籍信息表

    字段名字段类型字段说明
    idAutoField主键
    nameCharField书名
    idname
    1西游记
    2三国演义
  • 人物信息表

    字段名字段类型字段说明
    idAutoField主键
    nameCharField人名
    genderBooleanField性别
    bookForeignKey外键
    idnamegenderbook
    1孙悟空False1
    2白骨精True1
    3曹操False2
    4貂蝉True2

2. ORM 框架介绍

ORM(Object Relational Mapping)对象关系映射,就是把数据库表的行与相应的对象建立关联,互相转换,使得数据库的操作面向对象。

由于 DjangoModel 中内嵌了 ORM 框架,所以不需要直接面向数据库编程,而是定义模型类,通过 模型类和对象完成数据库的 增删查改

ORM DB

<===> 数据表 对象 <====> 数据行 属性 <====> 字段

3. 使用 Django 进行数据库开发的步骤

3.1 定义模型类

from django.db import models


"""
1. 我们的模型类需要继承自 models.Model
2. 系统会自动添加一个主键 id
3. 字段定义
    字段名=models.类型(选项)
    
    字段名不要使用 python、mysql 等关键字
"""


class BookInfo(models.Model):
    name = models.CharField(max_length=10)


# 人物
class PeopleInfo(models.Model):
    name = models.CharField(max_length=10)
    gender = models.BooleanField()
    # 外键
    book = models.ForeignKey(BookInfo, on_delete=models.CASCADE)

3.2 模型迁移

迁移由两部分完成:

  1. 生成迁移文件:根据模型类生成创建表的语句

    python manage.py makemigrations
    

    此时 /bookmanager/book/migrations 下会多出一个 0001_initial.py 文件,这便是生成的迁移文件。

  2. 执行迁移文件:根据第一步生成的语句在数据库中创建表

    python manage.py migrate
    

3.3 操作数据库

  1. 上一步生成的数据表在哪查看呢?

    /bookmanager/bookmanager/settings.py 文件里可以看到如下代码:

    # Database
    # https://docs.djangoproject.com/en/2.2/ref/settings/#databases
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }
    

    说明当前默认数据库用的是 sqlite3 数据库,存储数据的文件为 /bookmanager/db.sqlite3

  2. 查看 sqlite3 数据库

    首次查看,需要在 pycharm 里先安装对应的驱动,步骤如下:

    1. 双击 /bookmanager/db.sqlite3 文件;

    2. 下载驱动

    15.png

    此时在 pycharm 右侧 Database 里就能看到数据库了,在 Database/db/main/tables 下可以看到生成的 book_bookinfobook_peopleinfo 两张表。

3. 操作数据库

blog.csdn.net/An_muyan/ar…

blog.csdn.net/weixin_4410…

10.4 站点管理

10.4.1 管理界面本地化

  1. 启动项目下的 manage.py 文件

  2. 访问 http://127.0.0.1:8000/admin 进入登录页面

    界面默认是英文,需要改为中文,需要在 /项目名称/settings.py 里进行修改

    # settings.py
    
    # 设置语言
    # LANGUAGE_CODE = 'en-us'
    LANGUAGE_CODE = 'zh-Hans'
    
    # 设置时区
    # TIME_ZONE = 'UTC'
    TIME_ZONE = 'Asia/Shanghai'
    

10.4.2 创建管理员

  1. 运行python manage.py createsuperuser 创建超级用户的 账号、密码和邮箱

    这样就会在表 db.sqlite3/Schemas/main/Tables/auth_user 生成一条数据

    重置密码使用 python manager.py changepassword 用户名

  2. 在登录页面用刚才设置的账号密码进行登录

10.4.3 注册模型类

# /src/book/admin.py
from django.contrib import admin

from book.models import BookInfo, PeopleInfo
# 注册模型类
admin.site.register(BookInfo)
admin.site.register(PeopleInfo)
# 重启Django

10.4.4 发布内容到数据库

10.5 视图和路由

10.5.1 视图

# /src/book/views.py
from django.shortcuts import render
from django.http import HttpRequest
from django.http import HttpResponse
# Create your views here.
"""
视图
所谓的视图 其实就是python函数
视图函数有2个要求:
    1. 视图函数的第一个参数就是接收请求。这个请求其实就是 HttpRequest 的类对象
    2. 必须返回一个响应
"""
def index():
    return HttpResponse('ok')

10.5.2 路由

在子应用创建urls.py

# /src/book/urls.py
from django.urls import path
from book.views import index
# urlpatterns 是固定写法
urlpatterns = [
    # path('路由','视图函数名')
    path('index/', index)
]
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
    path('admin/', admin.site.urls),
    path('book/', include('book.urls'))
]

10.6 模板 Template

/src/settings.py 文件下的 TEMPLATE 变量里的 DIRS 属性里设置模板路径,例如:

TEMPLATES = [{
    ...,
    # 告知系统,我们的模板文件放在哪里
    'DIRS': [os.path.join(BASE_DIR, 'templates')],
    ...
}]

/src/book/views.py 里的 def index 改为:

def index(request):
    # return HttpResponse('ok')
    context = {
        'name': '马上双11'
    }
    return render(request, 'book/index.html', context=context)

10.7 配置文件 /src/settings.py

  • BASE_DIR

    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    # print(__file__)
    # C:\Users\Administrator\Envs\vir1\src\src\settings.py
    # print(os.path.abspath(__file__))
    # C:\Users\Administrator\Envs\vir1\src\src\settings.py
    # os.path.dirname() 获取文件的目录
    # print(os.path.dirname(os.path.abspath(__file__)))
    # C:\Users\Administrator\Envs\vir1\src\src
    
  • DEBUG = True 调试模式、 ALLOWED_HOSTS

    在我们开发的时候,我们需要看到更多的信息,所以要开启debug模式,当我们的程序上线之后,就改为False,此时,必须在 ALLOWED_HOSTS 里设置可访问的 ip 地址

  • 语言与时区

    # 设置语言
    # LANGUAGE_CODE = 'en-us'
    LANGUAGE_CODE = 'zh-Hans'
    
    # 设置时区
    # TIME_ZONE = 'UTC'
    TIME_ZONE = 'Asia/Shanghai'
    

10.8 静态文件

为了提供静态文件,需要在/src/settings.py配置两个参数:

# 存放查找静态文件的目录
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
# 访问静态文件的URL前缀
STATIC_URL = '/static/'

在浏览器访问:http://127.0.0.1:8000/static/c.png

10.9 App 应用配置

10.10 更换数据库

10.10. 1 在 MySQL 中创建数据库

create database book charset utf8;
use book;

10.10.2 修改 DATABASES 配置信息

修改 settings.py 中的 DATABASES

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '127.0.0.1',     # 主机
        'PORT': 3306,            # 端口号
        'USER': 'root',          # 用户名
        'PASSWORD': 'root',      # 密码
        'NAME': 'book',          # 数据库
    }
}

10.10.3 运行测试

报错:

django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module. Did you install mysqlclient?

原因:没有安装 mysqlclient

在虚拟环境中安装 mysqlclient

pip install mysqlclient

如果pip install mysqlclient 报错,需要在当前操作系统中安装 libmysqlclient-dev

sudo apt-get install libmysqlclient-dev