Django-11 模型层及ORM介绍
2021-07-13 本文已影响0人
JuliusL
Django配置mysql
- 安装mysqlclient[版本 mysqlclient 1.3.13以上,官网目前为1.4.x ]
sudo pip3 install mysqlclient
创建数据库
- 进入mysql数据库执行
- create database 数据库名 default charset utf8
- 通常数据库名跟项目名保持一致
- settings.py 里进行数据库的配置
- 修改DATABASES配置项的内容,由sqlite3变为mysql
创建好后如果报错:
NameError: name '_mysql' is not defined
需在项目的_init_.py文件下加
import pymysql
pymysql.install_as_MySQLdb()
重新执行后如果报错
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.4.0 or newer is required; you have 0.10.1.
有一个好办法,直接指定版本,比其他的解决方法简单一些…
import pymysql
pymysql.version_info = (1, 4, 13, "final", 0)
pymysql.install_as_MySQLdb()
什么是模型
- 模型是一个python类,它是由django.db.models.Model派生出的子类。
- 一个模型类代表数据库中的一张数据表
- 模型类中每一个类属性都代表数据库中的一个字段
- 模型是数据交互的接口,是代表和操作数据库的方法和方式
ORM框架
- 定义:ORM(Object Relational Mapping)即对象关系映射,它是一种程序技术,它允许你使用类和对象对数据库进行操作,从而避免通过SQL语句操作数据库
- 作用:
- 建立模型类和表之间的对应关系,允许我们通过面向对象的方式来操作数据库。
- 根据设计的模型类生成数据库中的表格
- 通过简单的配置就可以进行数据库的切换
- 优点
- 只需要面向对象编程,不需要面向数据库编写代码。
对数据库的操作都转化为对类属性和方法的操作
不用编写各种数据库的sql语句 - 实现了数据模型与数据库的解耦,屏蔽了不同数据库操作上的差异
不再关注用的是mysql,oracle...等数据库的内部细节
通过简单的配置就可以轻松更换数据库,而不需要修改代码
- 只需要面向对象编程,不需要面向数据库编写代码。
- 缺点
- 对于复杂业务,使用成本较高
- 根据对象的操作转换成SQL语句,根据查询的结果转换成对象,在映射过程中有性能损失
模型类代码示例
from django.db import models
# Create your models here.
class Book(models.Model):
title = models.CharField("书名",max_length=50,default='')
price = models.DecimalField('价格',max_digits=7,decimal_places=2,default=0.0)
数据库迁移
- 迁移是Django同步您对模型所做更改(添加字段,删除模型等)到您的数据库模式的方法
- 生成迁移文件 - 执行 python3 manage.py makemigrations
将应用下的models.py文件生成一个中间文件,并保存在migrations文件夹中 - 执行迁移脚本程序 - 执行 python3 manage.py migrate
执行迁移程序实现迁移。将每个应用下的migrations目录中的中间文件同步回数据库
- 生成迁移文件 - 执行 python3 manage.py makemigrations
实操:
^CliujiadeMacBook-Pro:mysite1 liujia$ python3 manage.py startapp bookstore
liujiadeMacBook-Pro:mysite1 liujia$ python3 manage.py makemigrations
Migrations for 'bookstore':
bookstore/migrations/0001_initial.py
- Create model Book
liujiadeMacBook-Pro:mysite1 liujia$ python3 manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, bookstore, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying bookstore.0001_initial... OK
Applying sessions.0001_initial... OK
liujiadeMacBook-Pro:mysite1 liujia$
mysql> use mysite1
Database changed
mysql> show tables;
Empty set (0.00 sec)
mysql> show tables;
+----------------------------+
| Tables_in_mysite1 |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| bookstore_book |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
+----------------------------+
11 rows in set (0.00 sec)
mysql> desc bookstore_book;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | bigint | NO | PRI | NULL | auto_increment |
| title | varchar(50) | NO | | NULL | |
| price | decimal(7,2) | NO | | NULL | |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.02 sec)
mysql>