Python-Django学习笔记(三)-Model模型的编写以及Oracle数据库的配置

Django使用的 MTV 设计模式(Models、Templates、Views)

因此本节将围绕这三部分并按照这个顺序来创建第一个页面

模型层models.py

    模型是数据唯一而且准确的信息来源。它包含你正在储存的数据的重要字段和行为。

    一般来说,每一个模型都映射一个数据库表,Django 将自动生成访问数据库的 API。

    web项目的数据一般都存在数据库中,模型与数据库的交互是通过 ORM (“对象-关系-映射”)完成。ORM 提供了对数据库的映射,不用直接编写SQL代码,只需像操作对象一样从数据库操作数据。这使软件开发人员专注于业务逻辑的处理,提高了开发效率。其工作原理如下:

绘图2

注意:

  • 每个模型都是一个 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

image

注意:一定要选择对应的版本!!!

    我的版本是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

执行完迁移,数据库中会根据模型中类和属性生成对应的表。

posted @ 2020-02-26 20:38  w鸑f鷟l  阅读(757)  评论(0)    收藏  举报