Django学习笔记二

模型类,字段,选项,查询,关联,聚合函数,管理器,

一 字段属性和选项

1.1 模型类属性命名限制

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

1.2 字段的类型

使用时需要引入django.db.models包,字段类型如下:

类型 描述
AutoField 自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性。
BooleanField 布尔字段,值为True或False。
NullBooleanField 支持Null、True、False三种值。
CharField(max_length=最大长度) 字符串。参数max_length表示最大字符个数。
TextField 大文本字段,一般超过4000个字符时使用。
IntegerField 整数
DecimalField(max_digits=None, decimal_places=None) 十进制浮点数。参数max_digits表示总位。参数decimal_places表示小数位数。
FloatField 浮点数。参数同上
DateField:([auto_now=False, auto_now_add=False]) 日期。1)参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false。2) 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false。3)参数auto_now_add和auto_now是相互排斥的,组合将会发生错误。
TimeField 时间,参数同DateField。
DateTimeField 日期时间,参数同DateField。
FileField 上传文件字段。
ImageField 继承于FileField,对上传的内容进行校验,确保是有效的图片

对比:null是数据库范畴的概念,blank是后台管理页面表单验证范畴的。
经验:
当修改模型类之后,如果添加的选项不影响表的结构,则不需要重新做迁移,商品的选项中default和blank不影响表结构。
参考文档:
http://python.usyiyi.cn/translate/django_182/index.html

1.3 选项

通过选项实现对字段的约束,选项如下:

选项名 描述
default 默认值。设置默认值。
primary_key 若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用。
unique 如果为True, 这个字段在表中必须有唯一值,默认值是False。
db_index 若值为True, 则在表中会为此字段创建索引,默认值是False。
db_column 字段的名称,如果未指定,则使用属性的名称。
null 如果为True,表示允许为空,默认值是False。
blank 如果为True,则该字段允许为空白,默认值是False。

对比:null是数据库范畴的概念,blank是后台管理页面表单验证范畴的。
经验:
当修改模型类之后,如果添加的选项不影响表的结构,则不需要重新做迁移,商品的选项中default和blank不影响表结构。
参考文档:
http://python.usyiyi.cn/translate/django_182/index.html

class BookInfo(models.Model):'''图书模型类'''# 图书名称btitle = models.CharField(max_length=20, db_column='title')# 图书名字唯一# btitle = models.CharField(max_length=20, unique=True, db_index=True)# 价格,最大位数为10,小数为2# bprice = models.DecimalField(max_digits=10, decimal_places=2)# 出版日期bpub_date = models.DateField()# bpub_date = models.DateField(auto_now_add=True) # 创建时间# bpub_date = models.DateField(auto_now=True) # 更新时间# 阅读量bread = models.IntegerField(default=0)# 评论量bcomment = models.IntegerField(default=0)# 删除标记isDelete = models.BooleanField(default=False)# book = models.Manager() # 自定一个Manager类对象,管理器对象objects = BookInfoManager() # 自定义一个BookInfoManager类的对象# @classmethod# def create_book(cls, btitle, bpub_date):#     '''添加一本图书'''#     # 创建一个cls类的对象#     obj = cls()#     obj.btitle = btitle#     obj.bpub_date = bpub_date#     # 添加进数据库#     obj.save()#     # 返回obj#     return objclass Meta:db_table = 'bookinfo' # 指定模型类对应表名

二查询

2.1 mysql的查询日志

mysql.log是mysql的日志文件,里面记录的对MySQL数据库的操作记录。默认情况下mysql的日志文件没有产生,需要修改mysql的配置文件,步骤如下:
1)使用下面的命令打开mysql的配置文件,去除68,69行的注释,然后保存。
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
2)重启mysql服务,就会产生mysql日志文件。
sudo service mysql restart
3)打开MySQL的日志文件。
/var/log/mysql/mysql.log 是mysql日志文件所在的位置。
使用下面的命令可以实时查看mysql的日志文件:
sudo tail -f /var/log/mysql/mysql.log

2.2 查询函数

通过模型类.objects属性可以调用如下函数,实现对模型类对应的数据表的查询。

函数名 功能 返回值 说明
get 返回表中满足条件的一条且只能有一条数据。 返回值是一个模型类对象。 参数中写查询条件。1) 如果查到多条数据,则抛异常MultipleObjectsReturned 2)查询不到数据,则抛异常:DoesNotExist。
all 返回模型类对应表格中的所有数据 返回值是QuerySet类型 查询集
filter 返回满足条件的数据 返回值是QuerySet类型 参数写查询条件。
exclude 返回不满足条件的数据 返回值是QuerySet类型 参数写查询条件
order_by 对查询结果进行排序 返回值是QuerySet类型 参数中写根据哪些字段进行排序

get示例:
例:查询图书id为3的图书信息。
all方法示例:
例:查询图书所有信息。
filter方法示例:
条件格式:
模型类属性名__条件名=值
查询图书评论量为34的图书的信息:
a)判等 条件名:exact。
例:查询编号为1的图书。

BookInfo.objects.get(id=1)

b)模糊查询
例:查询书名包含'传'的图书。contains

BookInfo.objects.filter(btitle__contains='传')

例:查询书名以'部'结尾的图书 endswith 开头:startswith

BookInfo.objects.filter(btitle__endswith='部')

c)空查询 isnull
例:查询书名不为空的图书。isnull

select * from booktest_bookinfo where btitle is not null;
BookInfo.objects.filter(btitle__isnull=False)

d)范围查询 in
例:查询id为1或3或5的图书。

select * from booktest_bookinfo where id in (1,3,5);
BookInfo.objects.filter(id__in = [1,3,5])

e)比较查询 gt(greate than) lt(less than) gte(equal) 大于等于
lte 小于等于
例:查询id大于3的图书。

Select * from booktest_bookinfo where id>3;
BookInfo.objects.filter(id__gt=3)

f)日期查询
例:查询1980年发表的图书。

BookInfo.objects.filter(bpub_date__year=1980)

例:查询1980年1月1日后发表的图书。
from datetime import date
BookInfo.objects.filter(bpub_date__gt=date(1980,1,1))
exclude方法示例:
例:查询id不为3的图书信息。

BookInfo.objects.exclude(id=3)

order_by方法示例:
作用:进行查询结果进行排序。
例:查询所有图书的信息,按照id从小到大进行排序。

BookInfo.objects.all().order_by('id')

例:查询所有图书的信息,按照id从大到小进行排序。

BookInfo.objects.all().order_by('-id')

例:把id大于3的图书信息按阅读量从大到小排序显示。

BookInfo.objects.filter(id__gt=3).order_by('-bread')

三 F和Q对象

F对象的作用:用于类属性之间的比较
使用之前需要先导入:

from django.db.models import F

例:查询图书阅读量大于评论量图书信息。

BookInfo.objects.filter(bread__gt=F('bcomment'))

例:查询图书阅读量大于2倍评论量图书信息。

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

Q对象的作用:用于查询时条件之间的逻辑关系。not and or,可以对Q对象进行&|~操作。
使用之前需要先导入:

from django.db.models import Q

例:查询id大于3且阅读量大于30的图书的信息。

BookInfo.objects.filter(id__gt=3, bread__gt=30)
BookInfo.objects.filter(Q(id__gt=3)&Q(bread__gt=30))

例:查询id大于3或者阅读量大于30的图书的信息。

BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30))

例:查询id不等于3图书的信息。

BookInfo.objects.filter(~Q(id=3))

四 聚合函数

作用:对查询结果进行聚合操作。
sum count avg max min
aggregate:调用这个函数来使用聚合。 返回值是一个字典
使用前需先导入聚合类:

from django.db.models import Sum,Count,Max,Min,Avg

例:查询所有图书的数目。

BookInfo.objects.all().aggregate(Count('id'))

{'id__count': 5}
例:查询所有图书阅读量的总和。

BookInfo.objects.aggregate(Sum('bread'))

{'bread__sum': 126}
count函数 返回值是一个数字
作用:统计满足条件数据的数目。
例:统计所有图书的数目。

BookInfo.objects.all().count()
BookInfo.objects.count()

例:统计id大于3的所有图书的数目。

BookInfo.objects.filter(id__gt=3).count()

小结:

参考文档:
http://python.usyiyi.cn/translate/django_182/ref/models/querysets.html

五 查询集

all, filter, exclude, order_by调用这些函数会产生一个查询集,QuerySet类对象可以继续调用上面的所有函数。
5.1 查询集特性
1) 惰性查询:只有在实际使用查询集中的数据的时候才会发生对数据库的真正查询。
2) 缓存:当使用的是同一个查询集时,第一次使用的时候会发生实际数据库的查询,然后把结果缓存起来,之后再使用这个查询集时,使用的是缓存中的结果。
5.2 限制查询集
可以对一个查询集进行取下标或者切片操作来限制查询集的结果。
对一个查询集进行切片操作会产生一个新的查询集,下标不允许为负数。
取出查询集第一条数据的两种方式:

方式 说明
b[0] 如果b[0]不存在,会抛出IndexError异常
b[0:1].get() 如果b[0:1].get()不存在,会抛出DoesNotExist异常。

exists:判断一个查询集中是否有数据。True False

六 模型类的关系

1) 一对多关系
例:图书类-英雄类
models.ForeignKey() 定义在多的类中。
2) 多对多关系
例:新闻类-新闻类型类 体育新闻 国际新闻
models.ManyToManyField() 定义在哪个类中都可以。
3) 一对一关系
例:员工基本信息类-员工详细信息类. 员工工号
models.OneToOneField定义在哪个类中都可以。
'''

# 新闻类型类
class NewsType(models.Model):# 类型名type_name = models.CharField(max_length=20)# 关系属性,代表类型下面的信息type_news = models.ManyToManyField('NewsInfo')# 新闻类
class NewsInfo(models.Model):# 新闻标题title = models.CharField(max_length=128)# 发布时间pub_date = models.DateTimeField(auto_now_add=True)# 信息内容content = models.TextField()# 关系属性, 代表信息所属的类型# news_type = models.ManyToManyField('NewsType')

七 关联查询(一对多)

7.1 查询和对象关联的数据

在一对多关系中,一对应的类我们把它叫做一类,多对应的那个类我们把它叫做多类,我们把多类中定义的建立关联的类属性叫做关联属性。
例:查询id为1的图书关联的英雄的信息。

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

通过模型类查询:
HeroInfo.objects.filter(hbook__id=1)
例:查询id为1的英雄关联的图书信息。

    h = HeroInfo.objects.get(id=1)h.hbook

通过模型类查询:

    BookInfo.objects.filter(heroinfo__id=1)

格式:

由一类的对象查询多类的时候:
一类的对象.多类名小写_set.all() #查询所用数据
由多类的对象查询一类的时候:
多类的对象.关联属性 #查询多类的对象对应的一类的对象
由多类的对象查询一类对象的id时候:
多类的对象. 关联属性_id

7.2 通过模型类实现关联查询

enter description here

例:查询图书信息,要求图书关联的英雄的描述包含'八'。
BookInfo.objects.filter(heroinfo__hcomment__contains='八')
例:查询图书信息,要求图书中的英雄的id大于3.
BookInfo.objects.filter(heroinfo__id__gt=3)
例:查询书名为“天龙八部”的所有英雄。
HeroInfo.objects.filter(hbook__btitle='天龙八部')
通过多类的条件查询一类的数据:
一类名.objects.filter(多类名小写__多类属性名__条件名)
通过一类的条件查询多类的数据:
多类名.objects.filter(关联属性__一类属性名__条件名)

八 删除,更新,插入,自关联

调用一个模型类对象的save方法的时候就可以实现对模型类对应数据表的插入和更新。
调用一个模型类对象的delete方法的时候就可以实现对模型类对应数据表数据的删除。
自关联:

enter description here

自关联是一种特殊的一对多的关系。
案例:显示广州市的上级地区和下级地区。
地区表:id, atitle, aParent_id;
mysql终端中批量执行sql语句:source areas.sql;

class AreaInfo(models.Model):'''地址模型类'''# 地区名称atitle = models.CharField(verbose_name='标题', max_length=20)# 自关联属性aParent = models.ForeignKey('self', null=True, blank=True)def __str__(self):return self.atitledef title(self):return self.atitletitle.admin_order_field = 'atitle'title.short_description = '地区名称'def parent(self):if self.aParent is None:return ''return self.aParent.atitleparent.short_description = '父级地区名称'

九 管理器

  1. BookInfo.objects.all()->objects是一个什么东西呢?
    答:objects是Django帮我自动生成的管理器对象,通过这个管理器可以实现对数据的查询。
    objects是models.Manger类的一个对象。自定义管理器之后Django不再帮我们生成默认的objects管理器。

  2. 自定义模型管理器类
    1)自定义一个管理器类,这个类继承models.Manger类。
    2)再在具体的模型类里定义一个自定义管理器类的对象。

  3. 自定义管理器类的应用场景
    1) 改变查询的结果集。
    比如调用BookInfo.books.all()返回的是没有删除的图书的数据。
    2) 添加额外的方法。
    管理器类中定义一个方法帮我们操作模型类对应的数据表。
    使用self.model()就可以创建一个跟自定义管理器对应的模型类对象。

# Create your models here.
class BookInfoManager(models.Manager):'''图书模型管理器类'''# 1.改变原有查询的结果集def all(self):# 1.调用父类的all方法,获取所有数据books = super().all() # QuerySet# 2.对books中的数据进行过滤books = books.filter(isDelete=False)# 返回booksreturn books# 2.封装方法,操作模型类对应的数据表(增删改查)def create_book(self, btitle, bpub_date):'''添加一本图书'''# 1.创建一个图书对象# 获取self所在的模型类model_class = self.modelbook = model_class()# book = BookInfo()book.btitle = btitlebook.bpub_date = bpub_date# 2.添加进数据库book.save()# 3.返回bookreturn book

小结:

enter description here

转载于:https://www.cnblogs.com/ChinacloudTech/p/10542254.html

Django学习笔记二相关推荐

  1. 九.django学习笔记二

    django学习之模型 我们在前面已经讲过,模型是专门与数据库交互的部分,那模型是如何实现增删改查的呢,已经如何在项目中使用我们的mysql数据库呢 一.数据库的增删改查 增:book = BookI ...

  2. 梅科尔工作室-Django学习笔记(二次学习)(3)

    本次学习的是如何用django实现前端鸿蒙OS登录 下面介绍一下本次的操作过程. 1.首先创立MySQL数据并将数据库导入到django当中 其中:导入数据库的操作: 2.配置urls 对应新建的pe ...

  3. django学习笔记03

    原创博客地址:django学习笔记03 第一章,模型层 查询集API 一.QuerySet何时被提交 迭代 QuerySet是可迭代的,在首次迭代查询集时执行实际的数据库查询 切片:如果使用切片的&q ...

  4. django学习笔记02

    原创博客地址:django学习笔记02 第一章:模型层 1.8 查询操作 一.创建对象 1 2 3 4 5 >>> from blog.models import Blog > ...

  5. django学习笔记01

    原创博客地址:django学习笔记01 基于教程,刘江的博客教程Django教程:https://www.liujiangblog.com/course/django/87 第一章:模型层 1.1 模 ...

  6. Django学习笔记(五)

    Django学习笔记(五) MVC和MTV对比 传统的MVC(Model-View-Controller) M 模型层,主要是对数据库层的封装 V 视图层,向用户展示结果 C 控制层,用于请求,获取数 ...

  7. qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...

  8. [转载]dorado学习笔记(二)

    原文地址:dorado学习笔记(二)作者:傻掛 ·isFirst, isLast在什么情况下使用?在遍历dataset的时候会用到 ·dorado执行的顺序,首先由jsp发送请求,调用相关的ViewM ...

  9. PyTorch学习笔记(二)——回归

    PyTorch学习笔记(二)--回归 本文主要是用PyTorch来实现一个简单的回归任务. 编辑器:spyder 1.引入相应的包及生成伪数据 import torch import torch.nn ...

  10. tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数

    tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报  分类: tensorflow(4)  目录(?)[+] 本笔记目的 ...

最新文章

  1. Java测试List<Object>根据其某个属性去重俩种方法效率
  2. 面向对象编程思想(2)--策略模式
  3. VTK:Qt之SideBySideRenderWindowsQt
  4. Lua基础之math(数学函数库)
  5. 【安全牛学习笔记】Kali Linux***测试介绍
  6. google搜索url参数总结
  7. C#实现的简单的随机抽号器
  8. python 100以内3的倍数_在python中确定3或5的倍数
  9. 【雅思】【写作】【大作文】Discuss both views and give your own opinion
  10. 苹果M1芯片为何如此快?
  11. 测试设计点-pc端和移动端微信加入群聊
  12. linux 之top命令详解
  13. Golang相关面试题
  14. Java项目:快递取件管理系统(java+SSM+JSP+jQuery+Mysql)
  15. Newstart HA 典型配置指导
  16. php里在调用wp,WordPress 教程:使用 WP_Http 在 WordPress 中发起 HTTP Request
  17. zigbee CC2530 系列教程 0 课程介绍
  18. escape,encodeURI,encodeURIComponent有什么区别?
  19. 中国移动飞信免费发短信API接口(第三方 Fetion API)
  20. 2012年7月8日13:08:08

热门文章

  1. WWW'22 | 信息检索方向值得一读的3篇论文详解
  2. ACL2021 | 探讨跨句事件联合抽取问题
  3. 【CV学习笔记】色彩空间
  4. 原价399,限时1元!7天人工智能入门训练营:带你从0掌握机器学习算法!
  5. 干货 | 集成学习综述与代码实现
  6. [NAACL19]无监督循环神经网络文法 (URNNG)
  7. pytorch之深度学习
  8. 灵活地横向扩展:从文件系统到分布式文件系统
  9. 如何为 MySQL 选择 CPU?
  10. 探究Windows内核你知多少