Django中模型(五)

六、模型查询

1、概述

查询集,表示从数据库获取的对象集合。

过滤器就是一个函数,基于所给的参数限制查询集结果。查询集可以有多个过滤器。

从sql角度来说,查询集合等价于select语句,过滤器等价于where条件。

2、查询集

A、概述

在管理器上调用过滤器方法返回查询集。查询集经过过滤器方法筛选后返回新的查询集,所以可以写成链式调用。

B、惰式执行

创建查询集不会带来任何数据的访问,直到调用数据时,才会访问数据库

C、直接访问数据库的情况

迭代、序列化、与if合用

D、过滤器

过滤器,返回查询集的方法称为过滤器。

all():返回所有数据

filter():

返回符合条件的数据。

filter(‘键’=‘值’):键是数据表中的字段名,值是条件。返回满足条件的数据

filter(‘键’=‘值’,‘键’=‘值’):返回同时满足两个条件的数据

filter(‘键’=‘值’). filter(‘键’=‘值’):同上

exclude():过滤掉符合条件的数据

order_by(‘字段名’):以某字段排序

values():一条数据就是一个对象(字典类),返回一个列表

E、返回单个数据

get():返回一个满足条件的对象。注意:如果没有找到符合条件的对象,会引发“模型类.DoesNotExist”异常;如果找到多个对象,会引发“模型类.MultipleObjectsReturned”异常。

count():返回当前查询集中的对象个数。

first():返回查询集中的第一个对象

last():返回查询集中的最后一个对象

exists():判断查询集中是否有数据,如果有数据则返回True

F、限制查询集

查询集返回列表,可以使用下标的方法进行限制,等同于sql中的limit语句。

eg:

studentsList=students.objects.all()[0:5]

注意:下标不能为负数

G、查询集的缓存

每个查询集都包含一个缓存,来最小化的对数据库访问;在新建的查询集中,缓存首次为空,第一次对数据集查询求值,会发生数据缓存,Django会将查询出来的数据做一个缓存,并返回查询结构,以后的查询直接使用查询集的缓存。

F、字段查询

概述:

实现了sql中的where语句,作为方法filter()、exclude()、get()的参数。

语法:

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

外键:

属性名_id

转义:

比较运算符:

exact:判断,区分大小写

contains:是否包含,区分大小写

eg:views.py

def studentsearch(request):

studentList=Students.objects.filter(sname_contains='孙')#查询Student数据表中sname字段值中包含‘孙’的值

    return rander(request,'news.html',{"students":studentList})

startswith(value),endswith(value):以value开头或结尾,区分大小写

eg:views.py

def studentsearch(request):

    studentList=Students.objects.filter(sname_startswith='孙') #查询Student数据表中sname字段值中以‘孙’开头的值

    return rander(request,'news.html',{"students":studentList})

注意:以上四个在前面加上i,表示不区分大小写。iexact,icontains,istartswith,iendswith。

isnull、isnotnull:

判断是否为空。和以上几个使用方法一致:属性名__isnull=False)

in:

是否在内。

gt:大于

gte:大于等于

lt:小于

lte:小于等于

year:年

month:月

day:天

week_day

minute:分

second:秒

G、查询快捷

PK:代表主键

H、聚合函数

聚合函数需写在aggregate()的括号里。还需要引入相应的模块:

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

Avg():取平均值

Count():返回数据的个数

Max():返回该字段的最大值

Min():返回该字段的最小值

Sun():返回该字段的和

eg:abs = table_name.objects.filter(date=n_lastday, brand=depart).aggregate(Max('rank'))

   打印结果为  {'rank__max': 42}

I:跨关联查询

处理join查询。语法:模型类名__属性名__比较运算符。

eg:返回描述中带有“孙红雷”这三个字的的数据属于哪个班级

grade=Grades.objects.filter(students__scontend__contains='孙红雷')

Grades:年级数据表,该表中有班级字段

students:学生数据表,该表中有描述字段“scontend”

contains:比较运算符,包含

J、F对象

使用模型A的属性与模型B属性进行比较,实际上是一条数据的两个值进行比较。

F对象支持算数符运算。

eg:views.py     取出女生人数比男生人数多的数据

from django.db.models import F

def grades(request):  

#取出女生人数比男生人数多的数据g=Grades.objects.filter(ggirlnum__gt=F('gboynum'))

#取出女生人数大于男生人数加20后的数据

gb=Grades.objects.filter(ggirlnum__gt=F('gboynum'+20))

    print(g)

    print(g)

Grades:年级数据表

ggirlnum:字段,女生人数

gt:比较运算符,大于

gboynum:字段,男生人数

K、Q对象

进行或查询。

eg:views.py

from django.db.models import Q
def grades(request):
#取出主键值小于3或sage大于18的所有值 s=Students.objects.filter(Q(PK__lte=3)|Q(sage__gt=18))#
print(s)

七、外键的添加

models.py

class A(models.Model):
title = models.CharField(max_length=20) class B(models.Model):
bname = models.CharField(max_length=20)
fk = models.ForeignKey(A, on_delete=models.DO_NOTHING)

views.py

from .models import *

# 方法一
B.objects.creat(bname='test', fk=A.object.get(id=1))
# 方法二
B.objects.creat(bname='test', fk_id=1)

Django中模型(五)的更多相关文章

  1. Django中模型(四)

    Django中模型(四) 五.创建对象 1.目的 向数据库中添加数据.当创建对象时,Django不会对数据库进行读写操作,当调用save()方法时,才与数据库交互,将对象保存到数据库中 2.注意 __ ...

  2. django中模型详解-字段类型与约束条件

    这片博文来详细说明django模型的使用,涉及到django模型的创建,字段介绍,以及django模型的crud操作,以及一对一等操作. 在使用模型之前,我们首先设置数据库选项,django的默认数据 ...

  3. Django中模型(三)

    Django中模型(三) 四.模型成员 1.类属性 objects:是Manager类的一个对象,作用是与数据库进行交互. 定义模型类时,没有定义管理器,则默认创建名为objects的管理器. 2.自 ...

  4. Django中模型(二)

    Django中模型(二) 三.定义模型 1.模型.属性.表.字段间的关系: 一个模型类在数据库中对应一张表:在模型类中定义的属性,对应该模型对照表中的字段. 2.定义属性 A.概述 ·django根据 ...

  5. Django中模型(一)

    Django中模型(一) 一.    基本开发流程 1.       配置数据库 2.       定义模型类:一个模型类都在数据库中对应一张数据表 3.       生成迁移文件 4.       ...

  6. Django中模型层中ORM的多表操作

    ORM的多表创建(一对一.一对多,多对多): 1模型创建 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等 ...

  7. Django中模型层中ORM的单表操作

    ORM概念: MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员 ...

  8. django中模型

    一.django需要使用数据库,则需要安装对应的驱动,比如mysql,则需要安装mysqlclient驱动: pip install mysqlclient 二.在settings.py文件中配置数据 ...

  9. python---Django中模型类中Meta元对象了解

    Django中模型类中Meta元对象了解 1.使用python manage.py shell 进入编辑命令行模式,可以直接进入项目(为我们配置好了环境) python manage.py shell ...

随机推荐

  1. Java - 慎用tagged class

    作者的原标题是<Prefer class hierarchies to tagged classes>,即用类层次优于tagged class. 我不知道有没有tagged class这么 ...

  2. 如鹏网学习笔记(十二)HTML5

    一.HTML5简介 HTML5是HTML语言第五次修改产生的新的HTML语言版本 改进主要包括: 增加新的HTML标签或者属性.新的CSS样式属性.新的JavaScript API等.同时删除了一些过 ...

  3. 如鹏网学习笔记(七)HTML基础

    HTML笔记 一.HTML简介 1,HTML (Hyper Text Mark-up Language) 超文本标记语言,是一种编程语言,也可以说是一种标准.规范. 2,HTML提供了一系列标记(标签 ...

  4. spring源码学习(一)

    由于本人水平有限,本文内容较为简单,仅供个人学习笔记,或者大家参考,如果能够帮助大家,荣幸之至!本文主要分析AnnotationConfigApplicationContext实例化之后,到底干了那些 ...

  5. equals、==和hashCode

    equals和== ==可以用于基本类型和引用类型:当用于基本类型时,比较值是否相同:当用于引用类型时,比较的是所指向的对象的地址是否相同.如果有包装类型,则先将包装类型转换为基本类型再比较值是否相等 ...

  6. java截取字符串

    public class Temp { public static void main(String[] args) { String a="dsadgafa34"; System ...

  7. mybatis大框架

    MyBatis   开源的数据持久化层框架 实体类与SQL语句之间建立映射关系 一:MyBatis前身是IBatis,本是Apache的一个开源的项目, 基于SQL语法,简单易学 ,是耦合度降低,方便 ...

  8. CSS3之word-wrap英文单词溢出强制换行

    语法 word-wrap: normal|break-word; 所有主流浏览器都支持 word-wrap 属性. <div style="border:1px #f00 solid; ...

  9. jquery 仿windows10菜单效果下载

    http://www.kuitao8.com/20150923/4079.shtml jquery 仿windows10菜单效果下载

  10. String class fetch functionality

    String类的获取功能: package com.itheima_04; /* * String类的获取功能: * int length():获取字符串的长度,其实也就是字符个数 * char ch ...