美文网首页
web应用框架——Django详解模型类

web应用框架——Django详解模型类

作者: 思君_4cd3 | 来源:发表于2020-04-15 18:22 被阅读0次

一.ORM

1.ORM简介:

ORM,全拼Object- Relation Mapping,幅意为对象关系映射,是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射ORM系统-般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。面向对象是从软件I程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象对象关系映射技术应运而生。O/R中字母0起源于“对象" (Object),而R则来自于"关系'(Relational)。 几乎所有的程序里面,都存在对象和关系数据库。在业务逻辑层和用户界面层中,我们是面向对象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。目前流行的ORM产品如Java的Hibernate, .Net的EntityFormerWork等。

二.详解模型类

1.准备工作

在我们讲解模型类之前先把讲解例子的环境弄好~

1.用Pycharm自带的Django环境创建一个文件

(具体操作在web应用框架的第一天最后一部分有进行详细讲解~)


创建

然后点击 New window


=创建完成
2.替换数据库(修改为MySQL数据库)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test2', #数据库名字,
        'USER': 'root', #数据库登录用户名
        'PASSWORD': 'root', #数据库登录密码
        'HOST': 'localhost', #数据库所在主机
        'PORT': '3306', #数据库端口
    }
}
数据库
3.配置init.py文件
import pymysql
pymysql.install_as_MySQLdb()
添加
4.打开终端进行操作
  • 在左下角打开Terminal


    打开终端操作
  • 开启MySQL服务(也就是phtStudy)


    开启
  • 新建一个test2数据库


    数据库

    别忘了将上面替换数据库的名称改成test2

  • 开启服务
    python manage.py runserver (按Tab键自动补齐)


    开启服务

    然后ctrl+c退出

  • 创建应用
    python manage.py startapp booktest


    创建app,刷新
  • 注册app


    注册
  • 添加模型类

from django.db import models

# Create your models here.

#定义图书模型类BookInfo
class BookInfo(models.Model):
    btitle = models.CharField(max_length=20)#图书名称
    bpub_date = models.DateField()#发布日期
    bread = models.IntegerField(default=0)#阅读量
    bcomment = models.IntegerField(default=0)#评论量
    isDelete = models.BooleanField(default=False)#逻辑删除

#定义英雄模型类HeroInfo
class HeroInfo(models.Model):
    hname = models.CharField(max_length=20)#英雄姓名
    hgender = models.BooleanField(default=True)#英雄性别
    isDelete = models.BooleanField(default=False)#逻辑删除
    hcomment = models.CharField(max_length=200)#英雄描述信息
    hbook = models.ForeignKey('BookInfo')#英雄与图书表的关系为一对多,所以属性定义在英雄模型类中
模型类

2..定义属性

Django根据属性的类型确定以下信息:

1.当前选择的数据库支持字段的类型
2.渲染管理表单时使用的默认html控件
3.在管理站点最低限度的验证
django会为表创建自动增长的主键列,每个模型只能有一个主键列, 如果使用选项设謀属性为主键列后django不会再创建自动增长的主键列。
右击表/创建表


创建表
  • 用命令行打开
    show databases;
    use test1;
    show tables;
    desc booktest_bookinfo;;


    命令行打开
    主键

默认创建的主键列属性为id,可以使用pk代替 , pk全拼为primary key。

  • ps:pk是主键的别名,若主键名为id2,那么pk是id2的别名。
属性命名限制:

1.不能是python的保留关键字。
2.不允许使用连续的下划线,这是由django的查询方式决定的,以后会详细讲解查询。
3.定义属性时需要指定字段类型,通过字段类型的参数指定选项,语法如下:

属性=models.字段类型(选项)

想了解更多有关Django的问题可以进入下面这个网址:
https://docs.djangoproject.com/en/3.0/

3.字段类型

使用时需要引入django.db.models包,段类型如下:
1.AutoField: 自动增长的IntegerField, 通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性。
2.BooleanField: 布尔字段,值为True或False。
3.NullBooleanField: 支持Null、 True、 False三种值。
4.CharField(max length=字符长度): 字符串。参数max_ length表示最大字符个数。
5.TextField: 大文本字段,一般超过4000个字符时使用。
6.IntegerField: 整数。
7.DecimalField(max_digits=None, decimal places=None): 十进制浮点数。参数max_ digits表示总位数。参数decimal places表示小数位数。
8.FloatField: 浮点数。
9.DateField[auto
now= False, auto_ now_ add=Falsel]):日期。

  • 参数auto_ now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false。
  • 参数auto_ now_ add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false。
  • 参数auto_ now_ add和auto_ now是相互排斥的,组合将会发生错误。


    例子

10.TimeField:时间,参数同DateField.
11.DateTimeField:日期时间,参数同DateField。
12.FileField:.上传文件字段。
13.ImageField:继承于FileField, 对上传的内容进行校验,确保是有效的图片

4.选项

通过选项实现对字段的约束,选项如下:
1.null: 如果为True,表示允许为空,默认值是False。
2.blank: 如果为True,则该字段允许为空白,默认值是False。
3.对比: null是数据库范畴的概念,blank是表单验证范畴的。
4.db_ column: 段的名称,如果未指定,则使用属性的名称。
5.db_ index: 若为True,则在表中会为此字段创建索引,默认值是False。
6.default: 默认值。
7.primary__key: 若为True,则该字段会成为模型的主键字段,默认值是False, -般作为AutoField的选项使用。
8.unique: 如果为True,这个字段在表中必须有唯一值,默认值是False。

综合例子:

1.修改booktest/models.py中的模型类,代码如下:

from django.db import models

# Create your models here.

#定义图书模型类BookInfo
class BookInfo(models.Model):
    #通过db_cloumn指定btitle对应表格中字段的名字为title
    btitle = models.CharField(max_length=20,db_column='title')#图书名称
    #会自动保存为当前修改的日期
    bpub_date = models.DateField(auto_now=True)#发布日期
    #第一次呗创建时的时间
    #bpub_date = models.DateField(auto_now_add=True)  # 发布日期
    bread = models.IntegerField(default=0)#阅读量
    bcomment = models.IntegerField(default=0)#评论量
    isDelete = models.BooleanField(default=False)#逻辑删除

#定义英雄模型类HeroInfo
class HeroInfo(models.Model):
    hname = models.CharField(max_length=20)#英雄姓名
    hgender = models.BooleanField(default=True)#英雄性别
    isDelete = models.BooleanField(default=False)#逻辑删除
    #hcomment对应的数据库中的字段是可以为空的,但是通过后台管理添加的时候不能为空
    hcomment = models.CharField(max_length=200,null=True,blank=False)#英雄描述信息
    hbook = models.ForeignKey('BookInfo')#英雄与图书表的关系为一对多,所以属性定义在英雄模型类中
修改的两处地方

2.进行数据库迁移

  • python manage.py makemigrations
  • python manage.py migrate


    迁移
    刷新

5.条件字段查询

实现sql中where的功能,调用过滤器filter()、 exclude()、 get(), 下面以filter()为例。
通过"属性名_id"表示外键对应对象的id值。
语法如下:

  • ps:属性名称和此较运算符间使用两个下划线,所以属性名不能包括多个下划线。

属性名称__比较运算符=值

6.配置mysql的数据库日志

查看mysq数据库日志可以查看对数据库的操作记录。mysq旧志文件默认没有产生, 要做如下配置:
1.右击test2数据库点击命令行界面:

  • show variables like "general_log%"; (查找日志文件是否打开)


    命令

    2.如果general_log的Value为OFF,则需要输入命令:

  • SET GLOBAL general_log = 'ON';


    将其打开

    3.再次输入命令查看是否打开

  • show variables like "general_log%";


    开啦

    4.复制下面的文件夹位置:
    F:\phpstudy\phpstudy_pro\Extensions\MySQL5.7.26\data


    打开
    打开
    当你再一次执行查看文件日志的命令时,日志也会跟着增加:
    例子

    5.插入数据:

insert into booktest_heroinfo(hname,hgender,hbook_id,hcomment,isDelete) values
('郭靖',1,1,'降龙十八掌',0),
('黄蓉',0,1,'打狗棍法',0),
('黄药师',1,1,'弹指神通',0),
('欧阳锋',1,1,'蛤蟆功',0),
('梅超风',0,1,'九阴白骨爪',0),
('乔峰',1,2,'降龙十八掌',0),
('段誉',1,2,'六脉神剑',0),
('虚竹',1,2,'天山六阳掌',0),
('王语嫣',0,2,'神仙姐姐',0),
('令狐冲',1,3,'独孤九剑',0),
('任盈盈',0,3,'弹琴',0),
('岳不群',1,3,'华山剑法',0),
('东方不败',0,3,'葵花宝典',0),
('胡斐',1,4,'胡家刀法',0),
('苗若兰',0,4,'黄衣',0),
('程灵素',0,4,'医术',0),
('袁紫衣',0,4,'六合拳',0);
英雄数据
insert into booktest_bookinfo(title,bpub_date,bread,bcomment,isDelete) values
('射雕英雄传','1980-5-1',12,34,0),
('天龙八部','1986-7-24',36,40,0),
('笑傲江湖','1995-12-24',20,80,0),
('雪山飞狐','1987-11-11',58,24,0);
记得修改数据

MySql数据库回顾:
登录mysql数据库:mysql -uroot -p
查看有哪些数据库:show databases
创建数据库:create database test2 charset=utf8; #切记: 指定编码
使用数据库: use test2;
查看数据库中的表: show tables;

7.条件运算符

1.进入命令行界面:
  • python manage.py shell


    shell界面
2.显示所有:
  • from booktest.models import *(导入类)
  • BookInfo.objects.all()


    显示所有
3.查询
  • exact:表示判等
    例如:查询编号为1的图书:


    报错

    当报这个错误的时候,就说明保护机制起作用了,因为长时间没有操作它,所以退出重进就好了

  • BookInfo.objects.filter(id=1)
  • BookInfo.objects.filter(id__exact=1)


    查询
    日志生成
4.模糊查询
  • contain:
    说明:如果要包含%无需转义,直接写即可。
    例如:查询书名包含‘英雄’的图书。


    查询
    日志显示
  • startswith,endswith:以指定值开头或结尾
    例如:查询书名以‘部’结尾的图书
  • BookInfo.objects.filter(btitle__endswith='部');


    查询

以上运算符都区分大写,在这些运算符前加上i表示不区分大写,如iexact、 icontains、

istartswith、iendswith.

5.空查询
  • isnull:是否为null
    例如:查询书名不为空的图书
  • BookInfo.objects.filter(btitle__isnull=False);


6.范围查询
  • in:是否包含在范围内
    例如:查询编号为1或3或5的图书
  • BookInfo.objects.filter(id__in=[1,3,5]);


7.比较查询
  • gt:大于
  • gte:大于等于
  • lt:小于
  • lte:小于等于
    例如:查询编号大于3的图书
  • BookInfo.objects.filter(id__gt=3);



    不等于的运算符,使用exclude()过滤器
    例如:查询编号不等于3的图书

  • BookInfo.objects.exclude(id=3);


8.日期查询

year,month、day、week_ day,hour,minute、second:对日期时间类型的属性进行运算。
例如:查询1980年发表的图书:

  • BookInfo.objects.filter(bpub_date__year=1980);



    例如:查询1980年1月1日后发表的图书:

  • from datetime import date
  • BookInfo.objects.filter(bpub_date__gt=date(1990,1,1));


8.F对象

之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢?
答:使用F对象,被定义在django.db.models中。

F(属性名)

例如:查询阅读量大于等于评论量的图书。

  • from django.db.models import F
  • BookInfo.objects.filter(bread__gte=F('bcomment'))



    可以在F对象上使用算数运算
    例如:查询阅读量大于2倍评论量的图书

  • BookInfo.objects.filter(bread__gt=F('bcomment')*2)


9.Q对象

多个过滤器逐个调用表示逻辑与关系,同sq|语句中where部分的and关键字。
例:查询阅读量大于20,粗编号于3的图书。

  • BookInfo.objects.filter(bread__gt=20,id__lt=3)
    或者
  • BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)



    如果要实现逻辑或or的查询,要使用Q()对象结合|运算符, Q对象被义在django.db.models中。

Q(属性名__运算符=值)

例如:查询阅读量大于20的图书,改为Q对象如下:

  • from django.db.models import Q
  • BookInfo.objects.filter(Q(bread__gt=20))



    Q对象可以使用&,|,链接,&表示逻辑与,|表示逻辑或

例如:查询阅读量大于20,或者编号小于3的图书,只能使用Q对象实现

  • BookInfo.objects.filter(Q(bread__gt=20)|Q(pk__lt=3))


Q对象前可以使用~操作符,表示非not
例如:查询编号不等于3的图书:

  • BookInfo.objects.filter(~Q(pk=3))


10.聚合函数

使用aggregate()过滤器调用聚合函数。
聚合函数包括: Avg, Count, Max, Min, Sum,被定义在django.db.models中。
例:查询图书的总阅读量:

  • from django.db.models import Sum
  • BookInfo.objects.aggregate(Sum('bread'))


  • 注意aggregate的返回值是一个字典类型,格式如下:

{'聚合类小写__属性名‘:值}
如:{’sum__bread':3}

使用count时一般不使用aggregate()过滤器
例如:查询图书总数

  • BookInfo.objects.count()



    注意count函数的返回值是一个数字。

(此文章仅作为个人学习笔记使用,如有错误欢迎指正~)

相关文章

  • web应用框架——Django详解模型类

    一.ORM 1.ORM简介: ORM,全拼Object- Relation Mapping,幅意为对象关系映射,是...

  • Flask(1)

    Django框架---web后端框架 Django重量级框架 模型类--->ORM映射 管理后台 Flask 轻量...

  • Flask框架

    Django框架---web后端框架 Django重量级框架模型类--->ORM映射对象关系映射(Object R...

  • Django入门

    Django简介 Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的框架模式,即模型...

  • Django环境配置

    django Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,...

  • 简约而不简单的Django新手图文教程

    Django简介 Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的框架模式,即模型...

  • 1.搭建Django应用框架

    Django简介 Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型...

  • Web应用框架

    Django-提供了构建Web系统的基本应用框架-MTV模式: 模型(model), 模板(Template), ...

  • 15个最受欢迎的Python开源框架

    一、Django: Python Web应用开发框架 Django是一个开放源代码的Web应用框架,由Python...

  • Django模型之meta选项详解

    Django模型之meta选项详解 Django模型类的Meta是一个内部类,它用于定义一些Django模型类的行...

网友评论

      本文标题:web应用框架——Django详解模型类

      本文链接:https://www.haomeiwen.com/subject/sgmqvhtx.html