Django框架(3) —— ORM框架、模型设计

ORM框架

  • O: object,类和对象
  • R: relation,关系,关系数据库中数据表
  • M: mapping,映射

在ORM框架中,它帮我们把类和数据表进行了一个映射,可以让我们通过类和类对象就能操作它所对应的表格中的数据。ORM框架还有一个功能,它可以根据我们设计的类自动帮我们生成数据库中的表格,省去了我们自己建表的过程。

django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的增删改查操作。

 

orm框架的作用:

  1. 建立类和表的关系,操作数据库不需要再写sql语句,通过类和对象就可以操作数据库
  2. 根据模型类生成表
  3. 通过方便的配置就可以进行数据库的切换

模型类设计

模型类定义在models.py文件中,继承自models.Model类。不需要定义主键列,在生成时会自动添加,并且值为自动增长

图书类:

  • 类名:BookInfo
  • 图书名称:b_title
  • 图书发布日期:b_pubdate
from django.db import models

# Create your models here.

class BookInfo(models.Model):
    """图书模型类"""
    # 书名·CharField字符串类型·max_length指定最大长度
    b_title = models.CharField(max_length=30)
    # 发布日期·DateField日期类型
    b_pubdate = models.DateField()
    

迁移

迁移前目录结构:

迁移由两步完成:

  • 1.生成迁移文件:根据模型类生成创建表的迁移文件。
  • 2.执行迁移:根据第一步生成的迁移文件在数据库中创建表。

生成迁移文件命令:

python manage.py makemigrations

执行生成迁移文件命令后,会在应用booktest/migrations目录中生成迁移文件0001_initial.py,

执行迁移命令:

python manage.py migrate

当执行迁移命令后,Django框架会读取迁移文件自动帮我们在数据库中生成对应的表格。

迁移后目录结构如下图:

Django默认采用sqlite3数据库,上图中的db.sqlite3就是Django框架帮我们自动生成的数据库文件。 sqlite3是一个很小的数据库,通常

在手机中,它跟mysql一样,我们也可以通过sql语句来操作它。视频上是使用sqliteman打开db.sqlite3文件进行查看。没有sqliteman,需

要先使用命令sudo apt-get install sqliteman进行安装。

我这里安装的是SQLiteFlow试用版,因为以后就不用sqlite

打开后如图:

打开db.sqlite3文件

默认生成的表名称

我们上面生成的表的名字叫做booktest_bookinfo,booktest是应用的名字,bookinfo是模型类的名字。

数据表的默认名称为:<app_name>_<model_name>,例:booktest_bookinfo

id不用我们自己设计,默认自增。

设计完图书类,然后再设计图书里的人物即英雄类,然后生成迁移文件并迁移,英雄类:

  • 类名:HeroInfo
  • 英雄姓名:h_name
  • 英雄性别:h_gender
  • 英雄简介:h_comment
  • 英雄所属图书:h_book
class HeroInfo(models.Model):
    """英雄模型类"""
    # 英雄名称
    h_name = models.CharField()
    # 英雄性别·BooleanField是bool类型,default设置默认值,False为男
    h_gender = models.BooleanField(default=False)
    # 英雄简介
    h_comment = models.CharField(max_length=200)
    # 英雄所属图书·关系属性,建立BookInfo和HeroInfo一对多关系
    h_book = models.ForeignKey("BookInfo")

在我们之后迁移生成表的时候,Django框架就会自动帮我们在图书表和英雄表之间建立一个外键关系。

迁移完成后数据会有两个表,如下图:

 

通过模型类操作数据表

进入项目shell的命令:

python manage.py shell

以下为在shell终端中演示的例子:

首先导入模型类:

from booktest.models import BookInfo,HeroInfo

1、向booktest_bookinfo表中插入一条数据

b = BookInfo()  # 定义一个BookInfo类的对象
b.btitle ='天龙八部'  # 定义b对象的属性并赋值
b.bpub_date = date(1990,1,11)
b.save()  # 才会将数据保存进数据库

2、查询出booktest_bookinfo表中id为1的数据。

b = BookInfo.objects.get(id=1)

3、在上一步的基础上改变b对应图书的出版日期。

b.b_pubdate = date(1989,10,21)

b.save()  # 才会更新表格中的数据

4、紧接上一步,删除b对应的图书的数据。

b.delete()  # 删除 

5、向booktest_heroInfo表中插入一条数据。

h = HeroInfo()
h.h_name = '郭靖'
h.h_gender = False
h.h_comment = ‘降龙十八掌’
h.h_book = b2  # 给关系属性赋值,英雄对象所属的图书对象
h.save()

6、查询图书表里面的所有内容。

BookInfo.objects.all()
HeroInfo.objects.all()

shell代码:

MacBook-Pro:test1 bianyachao$ python manage.py shell

Python 3.5.6 |Anaconda, Inc.| (default, Aug 26 2018, 16:30:03) 
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)

>>> from booktest.models import BookInfo, HeroInfo
>>> from datetime import date
>>> b = BookInfo()
>>> b.b_title = "天龙八部"
>>> b.b_pubdate = date(1990,1,11)
>>> b.save()
>>> b2 = BookInfo()
>>> b2.b_title = "射雕英雄传"
>>> b2.b_pubdate = date(1991,2,22)
>>> b.save()
>>> b2.save()
>>> b = BookInfo.objects.get(id=1)
>>> type(b)
<class 'booktest.models.BookInfo'>
>>> b.b_title
'天龙八部'
>>> b.b_pubdate
datetime.date(1990, 1, 11)
>>> b.b_pubdate = date(1989,2,10)
>>> b.save()
>>> h = HeroInfo()
>>> h.h_name = '郭靖'
>>> h.h_gender = False
>>> h.h_comment = '降龙十八掌'
>>> h.h_book = b2
>>> h.save()
>>> BookInfo.objects.all()
[<BookInfo: BookInfo object>, <BookInfo: BookInfo object>]
>>> HeroInfo.objects.all()
[<HeroInfo: HeroInfo object>]
>>> 

关系操作

查询出id为2的图书中所有英雄人物的信息

b = BookInfo.objects.get(id=2)
b.heroinfo_set.all()  # 查询出b图书中所有英雄人物的信息

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轨迹|

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值