Django入门--模型系统(一):模型基础
1.Django的ORM介绍
对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。
对象关系映射就是通过面向对象的方式操纵数据库,达到不用编写SQL语句就能实现对数据库的增删改查。只需要通过python的面向对象的方式就能够清楚数据之间的关系。
python是一个编程语言,一个软件,mysql是数据库管理系统,也是一个软件,python安装pymysql库后,通过编写SQL语句对mysql进行增删改查等操作,这需要对SQL语句非常了解。在数据库中,数据之间的关系通过表来展现。在编程语言中有一种面向对象的编程方式,对数据关系进行封装后描述事物之间的关系。
其映射关系为:
1). 模型类必须都写在app下的models.py文件中
2). 模型如果需要映射到数据库,所在的app必须被安装.
3). 一个数据表对应一个模型类; 表中的字段对应模型中的类属性; 模型的一个实例对应表中的一条数据**
2.Django连接mysql的配置流程
启动服务后,会生成一个db.sqlite3文件,该文件为Django数据库文件,在默认情况下Django配置了文件型的数据库,python自带了sqlite驱动。Django支持多种流行数据库,详细请看数据库参考文档
下面以连接MySql为例
(1).进入虚拟机,安装pymysql:pip install pymysql

(2).创建数据库用户:
1).--创建用户'willy',密码为'123456'
mysql > create user 'willy'@'%' identified by '123456'
2).赋予权限
mysql > grand all on *.* to 'willy'@'%'
3).权限生效
mysql > flush privileges
(3).在进入新用户,并创建数据库"crm":
mysql -A -uwilly -p123456 #进入新用户
create database crm; #创建数据库
(4).在主setting.py中找到模板设置DATABASES,并进行配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'crm', # 数据库名称
'USER':'willy', # 连接数据库的用户名
'PASSWORD':'123456', # 连接数据库的密码
'HOST':'127.0.0.1', # mysql服务器的域名和IP地址
'PORT':'3306', # mysql服务器的端口,默认为3306
}
}
'NAME'为创建的数据库名称、'USER'和‘PASSWORD’分别为新建的新用户和密码,必须与上面设置的相同。
(5).修改项目目录下的__init__.py (和settings.py文件在同一个目录)
import pymysql
pymysql.install_as_MySQLdb()
(6).在主setting.py中找到TIME_ZONE,设置时区:TIME_ZONE = 'Asia/ShangHai'
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = True
3.模型创建与激活
连接数据库后,需要创建并激活模型,基本流程如下
(1).创建模型
定义模型必须写在app下的model.py文件中,如在student/model.py:创建Student的模型,代表学生
from django.db import models
# Create your models here.
class Student(models.Model):
name = models.CharField(max_length=20) # 字符串,max_length必须给
age = models.SmallIntegerField(default=0) # default默认值
sex = models.SmallIntegerField(default=1)
qq = models.CharField(max_length=20, default='')
phone = models.CharField(max_length=20, default='')
c_time = models.DateTimeField(verbose_name='报名时间',
auto_now_add=True)
def __str__(self):
return '%s-%s' %(self.name, self.age)
总结:
1).任何模型都是django.db.models.Model的子类
2).类变量(属性)表示模型中的数据库字段
3).每一个字段由一个字段类的实例表示,如字符字段用CharField表示,日期字段用 DateTimeField表示
(2).激活模型
1)注册APP:
在主settings.py下的INSTALLED_APPS注册应用'student'

2)创建迁移(在项目根目录下):
迁移是Django对模型的更改方式,告诉Django我们做了哪些数据库更改,会在app/migrations下生成类似"0001_initial.py"的数据库迁移文件
python manage.py makemigrations student

注:若果不加"student",就会对settings中注册的所有app都进行迁移
3)查看SQL语句
获取迁移的SQL语句,可以看出Django的模型会自动创建'id'主键,表名的形式为:应用名_模块名小写
python manage.py sqlmigrate student 0001

4).应用迁移
创建迁移后,在mysql中还没用建立表,需要运行migrate命令,将迁移文件中的映射数据提交数据库
python manage.py migrate student

注:如果要删除表,可以在django模型中注释模型类,然后执行应用命令,不能手动在命令行删除。
3.数据的增删改查
通过命令进入django shell调试工具,然后进行数据的增删改查,首先安装ipython
(djenv) pyvip@VIP:~/DjProjects/crm$ pip install ipython # 安装ipython
(djenv) pyvip@VIP:~/DjProjects/crm$ python manage.py shell # 进入shell调试工具
In[1]:from student.models import Student # 导入模型,进行操作
接下来进行增删改查操作
(1).增加操作
如增加s1、s2、s3、s4学生信息
# 方法一:
In [1]: s1 = Student(name="Kitty", age=18, sex=0, qq="468531576")
In [2]: s1.save()
# 方法二:
In [3]: s2 = Student()
In [4]: s2.name = 'Tom'
In [5]: s2.age= 21
In [6]: s2.save()
# 方法三:
In [7]: Student.objects.create(name='Kate', age=20, phone='13647254681')
# 方法四:
In [8]: Student.objects.get_or_create(name='Rose', age=19, sex=0, phone='18647523473')
(2).查询操作
# 方法一:查询所有记录对象,输出QuerySet对象
In [9]: Student.objects.all()
Out[9]: <QuerySet [<Student: Kitty-18>,<Student: Tom-21>,<Student: Kate-20>,<Student: Rose-19>]>
# 方法二:过滤查询。输出QuerySet对象
In [10]: Student.objects.filter(sex=1)
Out[10]: <QuerySet [<Student: Tom-21>,<Student: Kate-20>]>
# 方法三:查询一个记录对象,输出单个对象,如果查询的对象有多个时会报错,与id一起用
In [11]: Student.objects.get(id=2)
Out[11]: <QuerySet [<Student: Tom-21>]>
In [12]: s = Student.objects.get(id=2)
In [13]: s .c_time
Out[13]: datetime.datetime(2019, 2, 24, 9, 10, 20, 987070, tzinfo=<UTC>)
从数据库中查询出来的结果一般是一个集合,这个集合称为QuerySet,他是一个可迭代对象,可以通过for循环、正向切片的方式进行取值,可以通过list强行将QuerySet变成列表
(3).更改操作
如把Kate的'sex'改成'0','Tom'的年龄改成'19'
# 修改1条
In [14]: s = Student.objects.get(name='Kate')
In [15]: s.sex = 0
In [16]: s.save()
In [17]: Student.objects.get(name='Kate').sex
Out[17]: 0
# update()修改多条数据
In [18]: Student.objects.filter(name='Tom').update(age=19)
Out[18]: 1 # 返回修改的条数
In [19]: Student.objects.get(name='Tom').age
Out[19]: 19
(4).删除操作
如删除学生'Rose',删除所有女生
# 修改1条
In [20]: s = Student.objects.get(name='Rose')
In [21]: s.delete()
Out[21]: (1, {'student.Student'}: 1)
# 修改多条
In [22]: s = Student.objects.filter(sex=0).delete
Out[22]: (3, {'student.Student}: 3)
Django入门--模型系统(一):模型基础的更多相关文章
- django用户认证系统——拓展 User 模型
Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...
- django用户认证系统——拓展 User 模型2
Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...
- [Django]模型学习记录篇--基础
模型学习记录篇,仅仅自己学习时做的记录!!! 实现模型变更的三个步骤: 修改你的模型(在models.py文件中). 运行python manage.py makemigrations ,为这些修改创 ...
- django模型系统(二)
django模型系统(二) 常用查询 每一个django模型类,都有一个默认的管理器,objects QuerySet表示数据库中对象的列表.他可以有0到国歌过滤器.过滤器通过给定参数,缩小查询范围( ...
- django模型系统(一)
django模型系统(一) djangode ORM ORM:对像关系映射 用python概念去表达数据库 数据库配置(mysql) 安装pumysql 修改项目目录下的__init__.py imp ...
- django 数据库配置 ,APP 迁移.模型基础
# 1.数据库的连接配置django 连接mysql的配置流程:- 安装 pymysql pip install pymysql- 创建数据库用户有创建数据库权限的用户- 创建数据库crm .进入数据 ...
- Django 路由、模板和模型系统
一.路由系统 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这 ...
- Django 模型系统(model)&ORM--基础
ORM 映射关系: 类 ---> 表 属性 ---> 字段 对象 --->一条数据 创建表(建立模型) 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作 ...
- Django模型系统——ORM校园管理系统代码
1.models.py from django.db import models # Create your models here. class Class(models.Model): id = ...
随机推荐
- UVA10862 - Connect the Cable Wires(递推 + java的大数)
UVA10862 - Connect the Cable Wires(递推 + java的大数) 题目链接 题目大意:给你n座房子位于一条直线上,然后仅仅给你一个cable service.要求每座房 ...
- 开启 J2EE(五)— Servlet之状态管理
HTTP无状态协议 首先我们要知道: HTTP协议是无状态协议. 我们知道HTTP协议就是server通过Request从浏览器接收和Response向浏览器输出的这么一个过程(浏览器和server的 ...
- 杭电1879继续畅通project
继续畅通project Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- 设计一部iphone手机用面向对象的方法
main.m //编辑字体大小command + < //编译执行快捷键 com + R #import <Foundation/Foundation.h> #import &quo ...
- tiny4412开机动画、开机界面的定制 【原创】
关键词:Android linux 开机logo 开机动画 平台信息:内核:linux3.0.68 系统:android/android5.1平台:tiny4412 作者:庄泽彬(欢迎转载,请注明 ...
- [Java] 总结1.5/1.6/1.7版本的特性
开发过程中接触到了从jdk1.5---jdk1.7的使用,在不同的阶段,都使用过了jdk的一些新特性,操作起来更加方面啦!特此总结了下,以下是测试代码: JDK1.5新特性: 1.自动装箱与拆箱: I ...
- Hdu-5992 2016ACM/ICPC亚洲区青岛站 K.Finding Hotels KDtree
题面 题意:二维平面上有很多点,每个点有个权值,现在给你一个点(很多组),权值v,让你找到权值小于等于v的点中离这个点最近的,相同的输出id小的 题解:很裸的KDtree,但是查询的时候有2个小限制, ...
- HDU2080 夹角有多大2
2019-05-17 15:00:09 加油加油,fightting !!! 这道题不知道acos()函数,acos()返回的是弧度,转化成度数要 / PI * 180 也没有想到通过向量 但是想到了 ...
- 关于CommandTimeOut
指示在终止尝试和产生错误之前执行命令期间需等待的时间. 设置和返回值 设置或返回长整型值,该值指示等待命令执行的时间(单位为秒).默认值为 30. 说明 Connection 对象或Command 上 ...
- C-Store论文阅读笔记
C-Store论文由今年的图灵奖获得者Mike Stonebraker提出来,整体架构在数据库领域相当不错.数据库采用读写分开存的架构,只写块的数据定期会和只读块儿的数据进行合并,产生新的只读块儿.而 ...