1. Django ORM

  • O(objects):类和对象。
  • R(Relation):关系,关系数据库中的表格。
  • M(Mapping):映射。

    Django ORM框架的功能:
  • a) 建立模型类和表之间的对应关系,允许我们通过面向对象的方式来操作数据库。
  • b) 根据设计的模型类生成数据库中的表格。
  • c) 通过方便的配置就可以进行数据库的切换。

2. Django数据库配置

2.1 mysql命令回顾

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

2.2 Django配置使用mysql数据库

修改settings.py中的DATABASES。

  1. sqlite3改为mysql,以及用户名、密码
  2. DATABASES = {
  3. 'default': {
  4. # 'ENGINE': 'django.db.backends.sqlite3',
  5. 'ENGINE': 'django.db.backends.mysql',
  6. # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  7. 'NAME': 'xxxx', # 使用的数据库的名字,数据库必须手动创建
  8. 'USER': 'root', # 链接mysql的用户名
  9. 'PASSWORD': '123', # 用户对应的密码
  10. 'HOST': 'localhost', # 指定mysql数据库所在电脑ip
  11. 'PORT': 3306, # mysql服务的端口号
  12. }
  13. }
  1. 注意:django框架不会自动帮我们生成mysql数据库,所以我们需要自己去创建。

2.3 切换mysql数据库之后不能启动服务器

  • 此时会报错:

    • django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.Did you install mysqlclient?
  • 需要安装操作mysql数据库的包,python2环境和python3环境有以下区别。

    • a) python2需要安装mysql-python:

      pip install mysql-python
    • b) python3需要安装pymysql:

      pip install pymysql
    • 可能连接超时,报错WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPConnection object at 0x7f938d8934a8>: Failed to establish a new connection: [Errno 111] Connection refused',)': /root/pypi/+simple/pymsql/
    • pip install pymsql -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
  • python3中安装好pymysql,需要在test2/init.py中加如下内容:

  1. import pymysql
  2. pymysql.install_as_MySQLdb()

3. 复习案例

  • 1)设计模型类并生成表

    • a) 设计BookInfo,增加属性bread和bcomment,另外设置软删除标记属性isDelete。
    1. class BookInfo(models.Model):
    2. '''图书模型类'''
    3. # 图书名称
    4. btitle = models.CharField(max_length=20)
    5. # 出版日期
    6. bpub_date = models.DateField()
    7. # 阅读量
    8. bread = models.IntegerField(default=0)
    9. # 评论量
    10. bcomment = models.IntegerField(default=0)
    11. # 删除标记
    12. isDelete = models.BooleanField(default=False)
    • b) 设计HeroInfo类,增加软删除标记属性isDelete。

      • 软删除标记: 删除数据时不做真正的删除,而是把标记数据设置为1表示删除,目的是防止重要的数据丢失。
    1. class HeroInfo(models.Model):
    2. '''英雄任务模型类'''
    3. # 英雄名
    4. hname = models.CharField(max_length=20)
    5. # 性别
    6. hgender = models.BooleanField(default=False)
    7. # 备注
    8. hcomment = models.CharField(max_length=200)
    9. # 关系属性
    10. hbook = models.ForeignKey('BookInfo', on_delete=models.CASCADE, )
    11. # 删除标记
    12. isDelete = models.BooleanField(default=False)
  • 2)编写视图函数并配置URL。

  • 3)创建模板文件。

    拆解功能:

  • 2.1) 图书信息展示页。

  • 2.1.1) 设计url,通过浏览器访问 http://127.0.0.1:8000/index时显示图书信息页面。

  1. # /test2/urls.py文件中:增加
  2. from django.conf.urls import include, url
  3. from django.contrib import admin
  4. urlpatterns = [
  5. url(r'^admin/', admin.site.urls),
  6. url(r'^', include(('booktest.urls', 'booktest'), namespace='booktest')),
  7. ]
  1. # 拷贝到booktest应用文件夹中,即/booktest/urls,并修改为:
  2. from django.conf.urls import url
  3. from booktest import views
  4. urlpatterns = [
  5. url(r'^index$', views.index), # 图书信息页面
  6. ]
  • 2.1.2)设计url对应的视图函数index,查询出所有图书的信息,将这些信息传递给模板文件。
  1. #views.py中:做视图,做完后配置url
  2. from django.shortcuts import render
  3. from booktest.models import BookInfo
  4. # Create your views here.
  5. def index(request):
  6. '''显示图书信息'''
  7. # 1.查询出所有图书的信息
  8. books = BookInfo.objects.all()
  9. # 2.使用模板
  10. return render(request, 'booktest/index.html',{'books':books})
  • 3.1) 编写模板文件index.html。
  1. <!--模板文件index.html中进行遍历:-->
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>图书信息</title>
  7. </head>
  8. <body>
  9. <ul>
  10. {% for book in books %}
  11. <li>{{ book.btitle}}</li>
  12. {% endfor %}
  13. </ul>
  14. </body>
  15. </html>
  1. 遍历显示出每一本图书的信息并增加新建和删除超链接。
  1. # 增加地址,去booktest/urls.py中添加:
  2. from django.conf.urls import url
  3. from booktest import views
  4. urlpatterns = [
  5. url(r'^index$', views.index), # 图书信息页面
  6. url(r'^create$', views.create), # 新增一本图书
  7. ]
  • 2.2.2) 设计url对应的视图函数create。
  1. def create(request):
  2. '''新增一本图书'''
  3. # 1.创建BookInfo对象
  4. b = BookInfo()
  5. b.btitle = '流星蝴蝶剑'
  6. b.bpub_date = date(1990,1,1) # date需要导入from datetime import date
  7. # 2.保存进数据库
  8. b.save()
  9. # 3.返回应答,返回数据
  10. return HttpResponse('ok')
  1. <!--index.html文件,body中增加:-->
  2. <a href="/create">新增</a>
  • 2.3) 页面重定向:服务器不返回页面,而是告诉浏览器再去请求其他的url地址。
  1. # views.py中修改为:
  2. from django.shortcuts import render
  3. from booktest.models import BookInfo
  4. from datetime import date
  5. from django.http import HttpResponse,HttpResponseRedirect
  6. # Create your views here.
  7. def index(request):
  8. '''显示图书信息'''
  9. # 1.查询出所有图书的信息
  10. books = BookInfo.objects.all()
  11. # 2.使用模板
  12. return render(request, 'booktest/index.html',{'books':books})
  13. def create(request):
  14. '''新增一本图书'''
  15. # 1.创建BookInfo对象
  16. b = BookInfo()
  17. b.btitle = '流星蝴蝶剑'
  18. b.bpub_date = date(1990,1,1)
  19. # 2.保存进数据库
  20. b.save()
  21. # 3.返回应答,让浏览器再访问/index
  22. # return HttpResponse('ok')
  23. return HttpResponseRedirect('/index') # 重定向,保持页面URL不变
  1. # booktest/url中添加:
  2. from django.conf.urls import url
  3. from booktest import views
  4. urlpatterns = [
  5. url(r'^index$', views.index), # 图书信息页面
  6. url(r'^create$', views.create), # 新增一本图书
  7. url(r'^delete(\d+)$', views.delete), # 删除点击的图书
  8. ]
  • 2.4.2) 设计url对应的视图函数delete。

    • 获取图书的id,进行删除。
  1. # 在视图views.py中增加delete函数:
  2. def delete(request, bid):
  3. '''删除点击的图书'''
  4. # 1.通过bid获取图书对象
  5. book = BookInfo.objects.get(id=bid)
  6. # 2.删除
  7. book.delete()
  8. # 3.重定向,让浏览器访问/index
  9. # return HttpResponseRedirect('/index') # 可使用redirect替换
  10. return redirect('/index')

4. 字段属性和选项

4.1 模型类属性命名限制

1)不能是python的保留关键字。

2)不允许使用连续的下划线,这是由django的查询方式决定的。

3)定义属性时需要指定字段类型,通过字段类型的参数指定选项,语法如下:

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

4.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,对上传的内容进行校验,确保是有效的图片。

4.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不影响表结构。

参考文档4.3

5. 查询

5.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

5.2 查询函数

  1. 通过模型类.objects属性可以调用如下函数,实现对模型类对应的数据表的查询。
  • 函数名 功能 返回值 说明
  • get 返回表中满足条件的一条且只能有一条数据。 返回值是一个模型类对象。 参数中写查询条件。
    • 1)如果查到多条数据,则抛异常MultipleObjectsReturned。
    • 2)查询不到数据,则抛异常:DoesNotExist。
    • a)判等 条件名:exact。例:查询编号为1的图书。
      • BookInfo.objects.get(id=1)
  • all 返回模型类对应表格中的所有数据。 返回值是QuerySet类型 查询集
    • all方法示例:查询图书所有信息。

      • BookInfo.objects.all()
  • filter 返回满足条件的数据。 返回值是QuerySet类型 参数写查询条件。
    • filter方法示例:

      • 条件格式:

        • 模型类属性名__条件名=值
        • 查询图书评论量为34的图书的信息:
    • 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 返回不满足条件的数据。 返回值是QuerySet类型 参数写查询条件。
    • exclude方法示例:查询id不为3的图书信息。

      • BookInfo.objects.exclude(id=3)
  • order_by 作用:进行查询结果进行排序。 返回值是QuerySet类型 参数中写根据哪些字段进行排序。
    • 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')

6. F对象

  1. 作用:用于类属性之间的比较。
  • 使用之前需要先导入:

    • from django.db.models import F
    • 例:查询图书阅读量大于评论量图书信息。
      • BookInfo.objects.filter(bread__gt=F('bcomment'))
    • 例:查询图书阅读量大于2倍评论量图书信息。
      • BookInfo.objects.filter(bread__gt=F('bcomment')*2)

7. Q对象

  1. 作用:用于查询时条件之间的逻辑关系。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))

8. 聚合函数

  1. 作用:对查询结果进行聚合操作。
  • 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()

小结:

  • get:返回一条且只能有一条数据,返回值是一个对象,参数可以写查询条件,
  • all:返回模型类对应表的所有数据,返回值是QuerySet。
  • filter:返回满足条件的数据,返回值是QuerySet,参数可以写查询条件。
  • exclude:返回不满足条件的数据,返回值是QuerySet,参数可以写查询条件。
  • order_by:对查询结果进行排序,返回值是QuerySet,参数中写排序的字段。
  • F对象:用于类属性间的比较。
  • Q对象:用于条件之间的逻辑关系。
  • aggregate:进行聚合操作,返回值是一个字典,进行聚合的时候需要先导入聚合类。
  • count:返回结果集中数据的数目,返回值是一个数字。

参考文档

9. 查询集

  1. all, filter, exclude, order_by调用这些函数会产生一个查询集,QuerySet类对象可以继续调用上面的所有函数。

9.1 查询集特性

  • 1) 惰性查询:只有在实际使用查询集中的数据的时候才会发生对数据库的真正查询。
  • 2) 缓存:当使用的是同一个查询集时,第一次使用的时候会发生实际数据库的查询,然后把结果缓存起来,之后再使用这个查询集时,使用的是缓存中的结果。

9.2 限制查询集

可以对一个查询集进行取下标或者切片操作来限制查询集的结果。

对一个查询集进行切片操作会产生一个新的查询集,下标不允许为负数。

  • 取出查询集第一条数据的两种方式:

    • 方式 说明

      • b[0] 如果b[0]不存在,会抛出IndexError异常
      • b[0:1].get() 如果b[0:1].get()不存在,会抛出DoesNotExist异常。
  • exists:判断一个查询集中是否有数据。True False

Django回顾之_03_Model属性及后端配置的更多相关文章

  1. django缓存优化中caches参数如何配置?

    在python开发中,如果运营django进行编写,为了提升效率,常常需要优化缓存,缓存优化中必须掌握的caches参数相关知识: CACHES 配置参数概述 - 格式 CACHES 字典配置格式如下 ...

  2. Nginx+Python+uwsgi+Django的web开发环境安装及配置

    Nginx+Python+uwsgi+Django的web开发环境安装及配置 nginx安装 nginx的安装这里就略过了... python安装 通常系统已经自带了,这里也略过 uwsgi安装 官网 ...

  3. Django之ORM-model模型属性

    Django1.8.2中文文档:Django1.8.2中文文档 或者 https://yiyibooks.cn/xx/django_182/index.html 项目准备 注释:关于项目准备,其实和后 ...

  4. Django回顾--配置文件

    """ Django settings for meiduo_mall project. Generated by 'django-admin startproject' ...

  5. 22Spring_JdbcTemplatem模板工具类的使用——使用外部属性文件来配置(properties)

    前一篇文章写得是xml文件来配置数据库连接的.但是为了方便,我们实际中采用的是properties文件的方式来配置数据库的.修改properties 文件 会比 修改 xml文件 方便. 做法是: 将 ...

  6. Django回顾

    Django简介 Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 半成品自定义we ...

  7. django之创建第7-4个项目-配置views文件实现url传值

    即:怎么实现url?name=xiaodeng&age=28等类似传值处理 1.配置views文件 # Create your views here. #coding:utf-8 from d ...

  8. 8 -- 深入使用Spring -- 1...4 属性占位符配置器

    8.1.4 属性占位符配置器 PropertyPlaceholderConfigurer 是一个容器后处理器,负责读取Properties属性文件里的属性值,并将这些属性值设置成Spring配置文件的 ...

  9. Opencv2.4.9+win7+VS2012一次性配置的方法--通过建立属性表永久配置

    Opencv的配置对于初学者很麻烦,网上的教程也非常多,针对不同的操作系统.opencv版本.Visual studio版本都有相应的教程,但即便是按照教程一步一步来,仍然难免出错,很多教程还是一次性 ...

随机推荐

  1. 2-10 就业课(2.0)-oozie:2、介绍和安装1

    oozie的安装及使用 1.  oozie的介绍 Oozie是运行在hadoop平台上的一种工作流调度引擎,它可以用来调度与管理hadoop任务,如,MapReduce.Pig等.那么,对于Oozie ...

  2. Java常考面试题(二)(转)

    序言 昨天刚开始的"每日5题面试"这类文章,感觉还不错,把一些平常看似懂了的东西,弄清楚了.就像什么是虚拟机?这个问题,看起来知道,但是要说出个所以然来,又懵逼了,经常回过头来看看 ...

  3. es和数据类型

    js=es+dom+bom,dom和bom前面已经讲完了 es是js的本体,是指数据类型,和对于数据的操作手段,他的版本更新得很快 这些功能不是html文件提供的,也不是浏览器提供的,即使脱离了dom ...

  4. 你从未见过的Case Study写作指南

    Case Study,意为案例分析,Case Study与其它的留学论文作业最大的的差别就在于Case Study在论文开始就需要明确给出论,然后再阐述这个结论的论证依据和理由.留学生们需要知道的是C ...

  5. ②java基础——标识符、关键字和基础数据类型

    Java标识符: 1.由英文字母.数字._(下划线)和$组成,长度不限.其中英文字母包含大写字母(A~Z)和小写字母(a~z),数字包含0到9 2.标识符的第一个字符不能是数字(即标识符不能以数字开头 ...

  6. JAVA笔记03 变量和运算符 面试题以及笔记

    标识符的命名规则需要注意哪几点? 定义 就是给类,接口,方法,变量等起名字的字符序列 组成规则 英文大小写字母 数字 $和_ 注意事项 不能以数字开头 不能是java中的关键字 区分大小写 常见的命名 ...

  7. python基础数据类型--元组(tuple)

    python基础数据类型--元组(tuple) 一.元组的定义和特性 定义:与列表相似,只不过就是将[ ] 改成 ( ) 特性:1.可以存放多个值 2.不可变 3.按照从左到右的顺序定义元组元素,下标 ...

  8. 从0开始自己配置一个vps虚拟服务器(2)

    配置php环境 1.安装php安装所依赖的包 yum -y install gcc gcc-c++ libxml2 libxml2-devel 2.cd usr/local/src 进入目录,在这个目 ...

  9. OPENCV2.46 与2.4.10以上版本的区别

    本人系统环境: CPU:Intel(R)Core(TM) i3-4160 CPU @ 3.60GHz 内存:4G 接两路摄像机,一路海康,一路艾普视达.CPU占有率95%.发现opencv2.4.10 ...

  10. VLC搭建RTSP服务器的过程

    第一步,打开VLC 第二步:在媒体下拉菜单下!有一个子菜单“串流”如图所示: 点击“串流”子菜单 弹出一个窗口!如下图所示. 添加一个你要串流的本地文件,我刚才传给你的那个长一点的文件. 第三步,会出 ...