• Index

Django 模型

Reads: 819 Edit

Django 对各种数据库提供了很好的支持,包括:MySQL、PostgreSQL、SQLite、Oracle。

Django 为这些数据库提供了统一的调用 API。我们可以根据自己业务需求选择不同的数据库。

本章节将以 Mysql 数据库作为范例进行介绍。你可以通过本站的 MySQL 教程 了解更多 MySQL 的基础知识。

如果你没安装 mysql 驱动,可以执行以下命令安装:

sudo pip3 install pymysql

1. Django ORM

Django 模型使用自带的 ORM。对象关系映射(Object Relational Mapping,简称 ORM )用于实现面向对象编程语言里不同类型系统的数据之间的转换。

ORM 在业务逻辑层和数据库层之间充当了桥梁的作用。

ORM 是通过使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中。

c4154a0a829123ef33c48adbc748c720

使用 ORM 的好处:

  • 提高开发效率。
  • 不同数据库可以平滑切换。

使用 ORM 的缺点:

  • ORM 代码转换为 SQL 语句时,需要花费一定的时间,执行效率会有所降低。
  • 长期写 ORM 代码,会降低编写 SQL 语句的能力。

ORM 解析过程:

  1. 1、ORM 会将 Python 代码转成为 SQL 语句。
  2. 2、SQL 语句通过 pymysql 传送到数据库服务端。
  3. 3、在数据库中执行 SQL 语句并将结果返回。

ORM 对应关系表:

00216fc6f015f2fdbbb980d1b1744125

2. 数据库配置

创建 MySQL 数据库( ORM 无法操作到数据库级别,只能操作到数据表)语法:

create database 数据库名称 default charset=utf8; # 防止编码问题,指定为 utf8

例如我们创建一个名为 codebaoku 数据库,编码指定为 utf8:

create database codebaoku default charset=utf8;   

我们在项目的 settings.py 文件中找到 DATABASES 配置项,将其信息修改为:

blog/blog/settings.py: 文件代码:

DATABASES = { 
    'default': 
    { 
        'ENGINE': 'django.db.backends.mysql',    # 数据库引擎
        'NAME': 'codebaoku', # 数据库名称
        'HOST': '192.168.11.12', # 数据库地址,本机 ip 地址 127.0.0.1 
        'PORT': 3306, # 端口 
        'USER': 'root',  # 数据库用户名
        'PASSWORD': '123456', # 数据库密码
    }  
}

接下来,告诉 Django 使用 pymysql 模块连接 mysql 数据库:

实例:

在与 settings.py 同级目录下的 init.py 中引入模块和进行配置

import pymysql
pymysql.install_as_MySQLdb()

3. 定义模型:

Django 规定,如果要使用模型,必须要创建一个 app。我们使用以下命令创建一个 app01 的 app:

django-admin.py startapp app01

目录结构如下:

(secker381) xinpingdeMacBook-Pro:blog xinping$ django-admin.py startapp app01
(secker381) xinpingdeMacBook-Pro:blog xinping$ tree
.
├── app01
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── blog
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-38.pyc
│   │   ├── settings.cpython-38.pyc
│   │   ├── urls.cpython-38.pyc
│   │   ├── views.cpython-38.pyc
│   │   └── wsgi.cpython-38.pyc
│   ├── settings.py
│   ├── urls.py
│   ├── views.py
│   └── wsgi.py
├── db.sqlite3
├── manage.py
└── templates
    └── codebaoku.html

5 directories, 20 files

我们修改 app01/models.py 文件,代码如下:

blog/app01/models.py: 文件代码:

from django.db import models
 
class Test(models.Model):
    name = models.CharField(max_length=20)

以上的类名代表了数据库表名,且继承了models.Model,类里面的字段代表数据表中的字段(name),数据类型则由CharField(相当于varchar)、DateField(相当于datetime), max_length 参数限定长度。

接下来在 settings.py 中找到INSTALLED_APPS这一项,如下:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01',  # 添加此项
]

在命令行中运行:

$ python3 manage.py migrate   # 创建表结构
$ python3 manage.py makemigrations app01  # 让 Django 知道我们在我们的模型有一些变更
$ python3 manage.py migrate app01   # 创建表结构

在命令行终端输入以下命令,在MySQ中生成数据表。

python3 manage.py makemigrations 
python3 manage.py migrate

django python manage.py makemigrations进行执行时报一下错误

    cursor.execute('SELECT @@SQL_AUTO_IS_NULL')
  File "/Users/xinping/opt/anaconda3/envs/secker_test/lib/python3.8/site-packages/django/db/backends/utils.py", line 103, in execute
    sql = self.db.ops.last_executed_query(self.cursor, sql, params)
  File "/Users/xinping/opt/anaconda3/envs/secker_test/lib/python3.8/site-packages/django/db/backends/mysql/operations.py", line 146, in last_executed_query
    query = query.decode(errors='replace')
AttributeError: 'str' object has no attribute 'decode'

修改 "/Users/xinping/opt/anaconda3/envs/secker_test/lib/python3.8/site-packages/django/db/backends/mysql/operations.py",将decode改为encode

v2-53f26f4becf7dbe1b50d65071a80536d_720w

4. 数据库操作:

接下来我们在 blog 目录中添加 testdb.py 文件(下面介绍),并修改 urls.py:

blog/blog/urls.py: 文件代码:

from django.urls import path
 
from . import views,testdb
 
urlpatterns = [
    path('codebaoku/', views.codebaoku),
    path('testdb/', testdb.testdb),
]
  1. 添加数据 添加数据需要先创建对象,然后再执行 save 函数,相当于SQL中的INSERT:

blog/blog/testdb.py: 文件代码:

# -*- coding: utf-8 -*-
 
from django.http import HttpResponse
 
from TestModel.models import Test
 
# 数据库操作
def testdb(request):
    test1 = Test(name='codebaoku')
    test1.save()
    return HttpResponse("<p>数据添加成功!</p>")

访问 http://127.0.0.1:8000/testdb 就可以看到数据添加成功的提示。

输出结果如下:

B7285187-C7D6-4096-959B-D8C78198EFBD


Comments

Make a comment

www.ultrapower.com ,王硕的博客,专注于研究互联网产品和技术,提供中文精品教程。 本网站与其它任何公司及/或商标无任何形式关联或合作。
  • Index
aaaaa