Python-Django学习笔记(三)-Model模型的编写以及Oracle数据库的配置
Django使用的 MTV 设计模式(Models、Templates、Views)
因此本节将围绕这三部分并按照这个顺序来创建第一个页面
模型层models.py
模型是数据唯一而且准确的信息来源。它包含你正在储存的数据的重要字段和行为。
一般来说,每一个模型都映射一个数据库表,Django 将自动生成访问数据库的 API。
web项目的数据一般都存在数据库中,模型与数据库的交互是通过 ORM (“对象-关系-映射”)完成。ORM 提供了对数据库的映射,不用直接编写SQL代码,只需像操作对象一样从数据库操作数据。这使软件开发人员专注于业务逻辑的处理,提高了开发效率。其工作原理如下:
注意:
- 每个模型都是一个 Python 的类,这些类继承 django.db.models.Model
- 模型类的每个属性都相当于一个数据库的字段。
(1) 数据库的配置
由于课程需要以及网上大多为MySQL配置教程,在这里将使用 Oracle 数据库(12c)配置。
1、新建Oracle用户并赋权
打开命令提示框输入以下内容
1.输入:sqlplus /nolog //进入oralce控制台
2.输入:conn /as sysdba //以管理员权限登录
3.输入:create user c##note identified by 1234; //创建用户名c##note密码1234
4.输入:grant dba to c##note; //授予DBA权限
2、cx_oracle的下载与安装
cx_oracle的作用类似于jdbc驱动,必须安装好才可以进行django与Oracle数据库的连接
cx_oracle下载地址:https://pypi.org/project/cx-Oracle/#files
注意:一定要选择对应的版本!!!
我的版本是python3.7、Oracle12c以及Windows64位系统( 图中cp37即python3.7 )
下载完成后打开cmd进入下载的目录,输入:
pip install cx_Oracle-7.3.0-cp37-cp37m-win_amd64.whl
此时,cx_oracle安装完成。
3、配置settings.py
打开settings.py( 位置在项目目录下与项目同名的文件夹内 ),找到 DATABASES 对其进行配置。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'orcl',
'USER': 'c##note',
'PASSWORD': '1234',
'IP': '127.0.0.1',
'HOST': '1521',
}
}
其中:
NAME 为配置Oracle数据库时的 SID。
(2) 在firstApp应用内创建一个model
打开firstApp/models.py,加入以下示例代码:
class Person(models.Model):
firest_name=models.CharField(max_length=30)
last_name=models.CharField(max_length=30)
class Meta:
db_table="person"
以上的 Person 模型能创建一个数据库表,如下:
CREATE TABLE myapp_person (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(30) NOT NULL
);
…………以下提供model创建的常用 字段类型 对照:
- AutoField:自动增长的IntegerField,通常不用指定,不指定时Django 会自动创建属性名为id的自动增长属性
- BooleanField:布尔字段,值为True或者False
- NullBooleanField:支持Null、True、False
- CharField:字符串,参数max_length表示最大字符个数
- TextField:大文本字段,一般超过4000个字符时使用
- IntegerField:整数
- DecimalField:十进制浮点数,参数max_digits表示总位数,参数decimal_places表示小数位数
- FloatField:浮点数
- DateField:日期, 参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add和auto_now是相互排斥的,组合将会发生错误
- TimeField:时间,参数同DateField
- DateTimeField:日期时间,参数同DateField
- FileField:上传文件字段
- ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片
…………常见 字段选项 对照:
(创建属性时,加入参数列表,如: phone = models.CharField(max_length=32, primary_key=True) )
- primary_key: 指定是否为主键,True表示为主键。
- unique: 指定是否唯一,True表示是唯一的。
- null: 指定是否为空,默认为False。
- blank: 等于True时form表单验证时可以为空,默认为False。
- default: 设置默认值。
- auto_now: 每次修改都会将当前时间更新进去,只有调用QuerySet.update方法将不会调用。这个参数只是Date和DateTime以及TimModel.save()方法才会调用。
- auto_now_add: 第一次添加进数据库,都会将当前时间设置进去。以后修改,不会修改这个值。
…………常用关系字段对照:
1、一对一关系:一对一关系适用于表的字段过多,需要拆分。
class Person(models.Model):
name = models.CharField(max_length=50) class CardID(models.Model): #声明关系的为从表。
ID=models.IntegerField()
link_person = models.OneToOneField(Person,on_delete=models.CASCADE)
其中on_delete=models.CASCADE表示级联删除,也就是当删除主表的数据时候从表中的数据也随着一起删除。
当on_delete=models.PROTECT时表示删除主表数据时,如果从表中有关联则无法删除。删除从表数据,主表数据不动。
2、一对多关系:
例如,如果一个Car 模型有一个制造者Manufacturer,也就是说一个Manufacturer可制造很多辆车,但是每辆车属于某个特定的制造者(一个汽车厂商可以生产很多汽车,但是不是每个汽车都是这个厂商的),使用下面的方法定义这个关系:
from django.db import models
class Manufacturer(models.Model): #制造者
pass
class Car(models.Model): #车
link_manufacturer = models.ForeignKey(Manufacturer,on_delete=models.CASCADE)
上例中的link_manufacturer为想要关联的模型名,可以自己取名。
ForeignKey括号内的Manufacturer是要关联的类名。
3、多对多关系:
例如:一个顾客可以选择多种商品,一种商品也可以被多个顾客购买。这样他们的模型关系就是:
class Customer(models.Model):
name = models.CharField(max_length=20)
level = models.IntegerField()
class Meta:
db_table = "customers"
class Product(models.Model):
name = models.CharField(max_length=20)
count = models.IntegerField()
price = models.FloatField()
customers = models.ManyToManyField(Customer)
class Meta:
db_table = "products"
其中,ManyToManyField括号中的参数就是与他多对多关系的类名。
创建完毕迁移到数据库后,数据库会自动生成三张表,customers表、products表、关系表。
关系表是自动生成的,用来关联customer和products这两张表。
(3) 数据迁移(建立的模型生成数据库表)
创建完模型后,找到项目目录(manage.py所在的目录),生成一个迁移文件,在命令行输入:
python manage.py makemigrations
生成迁移文件之后,执行迁移文件,在命令行输入:
python manage.py migrate
执行完迁移,数据库中会根据模型中类和属性生成对应的表。
Python-Django学习笔记(三)-Model模型的编写以及Oracle数据库的配置的更多相关文章
- springmvc学习笔记三:整合JDBC,简单案例==数据库事务配置(切面)
package cn.itcast.bean; import org.springframework.jdbc.core.PreparedStatementSetter; public class U ...
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- Python——Django学习笔记
Django——一个封装好的神奇框架 若本文有任何内容错误,望各位大佬指出批评,并请直接联系作者修改,谢谢!小白学习不易. 一.简要模型 模型类操作数据表: python manage.py shel ...
- Python & Django 学习笔记
最近在学校Python和Django.在学习中遇到了种种的问题,对于一个新手来说,下面的问题可能都会遇到.希望能帮助到那些和我一样的人!!0.python-dev安装(ubuntu) apt-get ...
- python Django 学习笔记(六)—— 写一个简单blog做增删改练手
简单效果图 1,创建一个项目myblog 可参考这里 myblog/ manage.py myblog/ __init__.py settings.py urls.py wsgi.py 2,创建blo ...
- python Django 学习笔记(四)—— 使用MySQL数据库
1,下载安装MySQLdb类库 http://www.djangoproject.com/r/python-mysql/ 2,修改settings.py 配置数据属性 DATABASES = { 'd ...
- python Django 学习笔记(一)—— Django安装
注:本人python版本2.7.5 ,win7系统 安装Django https://www.djangoproject.com/download/ 官方下载Django-1.5.5.tar.gz 1 ...
- python Django 学习笔记(二)—— 一个简单的网页
1,创建一个django项目 使用django-admin.py startproject MyDjangoSite 参考这里 2,建立视图 from django.http import HttpR ...
- python Django 学习笔记(三)—— 模版的使用
模版基本介绍 模板是一个文本,用于分离文档的表现形式和内容. 模板定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑(模板标签). 模板通常用于产生HTML,但是Django的模板也能产生任何 ...
随机推荐
- get、post请求参数乱码解决方法(qq:1324981084)
java高级架构师全套vip教学视频,需要的加我qq1324981084 在实际的项目中我们会遇见中文乱码的问题,这个问题是很恶心的事,所以我在这里提供了一些解决中文乱码的方法,希望能给大家一些帮助. ...
- Winfrom 减少控件重绘闪烁的方法
Winform控件的双缓冲.控件的双缓冲属性是隐藏的,可以通过反射改变其属性值. lv.GetType().GetProperty("DoubleBuffered", Bindin ...
- django 定时任务 django-crontab 的使用
成功例子如下图: 1.前言 在做 django 开发需求时,多多少少都会遇到需要定时任务的功能,比如定时执行任务,检查订单之类的.可能是一段时间,比如每隔 10分钟执行一次,也可能是定点时间,比如 1 ...
- Android中TimePicker时间选择器的使用和获取选择的时和分
场景 实现效果如下 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改 ...
- CSGO控制台命令
转帖: 按下“~”即可开启 使用时先输入参数名 然后按下SPACE空出一格 再输入设定值即可 一般玩家进入游戏都只能用到Client(玩家用参数) 不过...如果你是开LAN GAME的人 就能进阶到 ...
- js中(function(){})()的写法用处
直到今天我才明白的一个玩意!!! 来来来,首先嘛,JS中函数有两种命名方式 1.一种是声明式. 而声明式会导致函数提升,function会被解释器优先编译.即我们用声明式写函数,可以在任何区域声明,不 ...
- Java线程池中线程的生命周期
设:我们有一个coreSize=10,maxSize=20,keepAliveTime=60s,queue=40 1.池初始化时里面没有任何线程. 2.当有一个任务提交到池就创建第一个线程. 3.若继 ...
- JavaScript对象模型概念
1.对象的概念 JavaScript只有函数对象才有类的概念,因此创建一个对象,必须使用函数对象.(ES6中可以直接声明一个class,实质上也是一个函数对象). 函数对象的内部有[[Construc ...
- Asp.Net Core 3.1 集成Swagger
引入Nuget包 Swashbuckle.AspNetCore.SwaggerGen Swashbuckle.AspNetCore.SwaggerUI 配置Startup 配置ConfigureSer ...
- BUGFIX 09 - 记一次Java中String的split正则表达式匹配 - 引发`OutOfMemoryError: Java heap space`的oom异常 排查及解决 -Java根据指定分隔符分割字符串,忽略在引号里面的分隔符
问题简述 说白了,Java根据指定分隔符分割字符串,忽略在引号(单引号和双引号)里面的分隔符; oom压测的时候,正则匹配"(?=(?:[^\"]*\"[^\" ...