1.常用查询

模型类上的管理器: ** 模型类.objects **

(1)常用一般查询
  1. rs = Student.objects.all() # 查询所有记录,返回Queryset
  2. print(rs.query) # 返回rs的SQL语句, 针对Queryset对象
  3. rs = Student.objects.filter(name='XM') # 条件查询, 可传多个参数, 返回Queryset
  4. # from django.db.models import Q
  5. # Student.objects.filter(Q(age=20)|Q(age=18)) #多条件OR查询
  6. rs = Student.objects.exclude(name='XM') # 查询排除name='XM'的记录, 可传多个参数, 返回Queryset
  7. rs = Student.objects.get(id=2) # 查询一条记录, 返回对象, 若果有多个对象符合, 则会报错
  8. rs = Student.objects.first() # 查询第一条数据, 返回对象,不能query
  9. rs = Student.objects.last() # 查询最后一条数据, 返回对象
  1. rs = Student.objects.order_by('age') # 对年龄结果排序
  2. rs = Student.objects.order_by('age', 'id') # 多项排序
  3. rs = Student.objects.order_by('-age') # 反向排序
  4. # from django.db.models.functions import Lower
  5. # rs = Sudent.objects.order_by(Lower('name').desc) # 名字转成小写,并从大到小排序
  1. rs = Student.objects.values('name').filter(age=20)# 针对name字段查询, 返回字典列表
  2. rs = Student.objects.all().values() # 将返回的QuerySet中的Model转换成字典
  3. rs = Student.objects.only('name') # 与values一样, 区别是除了name字段还返回id字段, 返回对象
  4. rs = Student.objects.only('name').filter(age=0)
  5. rs = Student.objects.defer('name') # 查询除name以外的字段, 用法与only相同, 作用相反, 返回对象
  1. rs = Student.objects.all()[:5] # 切片, 相当于limit,不支持负索引, 返回Queryset
  2. rs = Student.objects.all()[::2] # 支持步长,返回列表对象
  3. ## 切片后, 不再支持附加条件过滤和索引
(2)常用条件查询

支持exclude、filter、get,返回Queryset

  1. rs = Student.objects.filter(name__exact='XM') # exact等于, 相当于"=", iexact为忽略大小写
  2. rs = Student.objects.filter(name__contains='X') # contains包含相当于"like", icontains为忽略大小写
  3. rs = Student.objects.filter(name__startswith='X') # startswith以什么开头, istartswith为忽略大小写
  4. rs = Student.objects.filter(name__endswith='M') # endswith以什么结尾, iendswith为忽略大小写
  5. rs = Student.objects.filter(age__in=[18, 19, 20]) # in成员所属
  6. rs = Student.objects.filter(age__gt=20) # gt大于、gte大于等于、lt小于、lte小于等于
  7. rs = Student.objects.filter(age__range=(18,25)) # range区间
  8. rs = Student.objects.filter(city__isnull=True) # isnull判断是否为空
(3)聚合查询

导入模块: from django.db.models import Count, Avg, Max, Min, Sum,通过Queryset的aggregate()调用

  1. from django.db.models import Count, Avg, Max, Min, Sum
  2. rs = Student.objects.count() # 获取当前查询到的数据的总数, 返回Int, 支持附加条件过滤
  3. rs = Student.objects.filter(name__startswith='X').count()
  4. rs = Student.objects.aggregate(age_avg=Avg('age')) # 获取年龄平均值, age_avg为命名, 返回字典, 支持附加条件过滤
  5. rs = Student.objects.aggregate(age_max=Max('age'))
  6. rs = Student.objects.aggregate(age_min=Min('age'))
  7. rs = Student.objects.aggregate(age_sun=Sum('age'))
(4)分组查询

与values、Count等聚合查询语句一起使用,需要导入聚合查询模块, 通过Queryset的annotate()调用

  1. # 分性别查询男女生人数
  2. '''SQL语句:select sex, count(sex) as num from student group by sex;'''
  3. from django.db.models import Count, Avg, Max, Min, Sum
  4. rs = Student.objects.values('sex').annotate(num=Count('sex'))# values为分组的字段,num为命名,返回字典列表
  5. rs = Student.objects.values('sex').annotate(num = Avg('sex'))

2.常用的模型字段类型

IntegerField       整型,映射到数据库中的int型

AutoField         整型,具有自增长属性,添加"primaty_key=True"就是一个主键

CharField         字符型,映射到数据库中的varchar类型,必须通过max_length指定长度

TextField         文本类型,映射到数据库中的text类型

BooleanField      布尔类型,映射 到数据库中的 tinyint类型,传递True/False,如果可以为空时,使用NullBooleanField

DateField         日期类型,映射到数据库中的date类型,

设置DateField.auto_now=True可以设置该字段为当前时间, 每次修改模型内容该字段都会变化

设置DateField.auto_now_add=True可以设置当对象第一次创建时自动设置当前时间, 时间固定,不会随着模型变化而变化

DateTimeField       日期时间类型,映射到数据库中的datetime类型,在使用的时候传递datetime.detetime()进去

3.Field常用参数

primary_key               指定是否为主键

unique                指定是否唯一

null                   指定是否为空,默认为False

blank                    等于True时form表单验证时可以为空,默认为False

default                 设置默认值

DateField.auto_now           每次修改都会将当前的时间更新

DateField.auto_add_now      第一次添加进去,都会将当前时间设置进去,以后修改,不会改变该值

4.表关系的实现

(1)OneToOne

用一张表的主键外键关联另一张表的主键

  1. # 设置on_delete,当删除某个学生,该生的详情信息也会删掉
  2. student = models.OneToOneField('student', on_delete=models.CASCADE)

example:学生表与学生详情表建立一对一的关系

  1. from django.db import models
  2. class Student(models.Model):
  3. name = models.CharField(max_length=20) # 字符串,max_length必须给
  4. age = models.SmallIntegerField(default=0) # default默认值
  5. sex = models.SmallIntegerField(default=1)
  6. qq = models.CharField(max_length=20, unique=True, null=True)
  7. phone = models.CharField(max_length=30, unique=True, null=True)
  8. c_time = models.DateTimeField(verbose_name='报名时间', auto_now_add=True)
  9. e_time = models.DateTimeField(verbose_name='编辑时间', auto_now=True)
  10. def __str__(self):
  11. return '%s-%s' %(self.name, self.age)
  12. class StudentDetail(models.Model):
  13. num = models.CharField(max_length=20, default='')
  14. college = models.CharField(max_length=20, default='')
  15. student = models.OneToOneField('student', on_delete=models.CASCADE)
(2)OneToMany

一对多,在属于多的模型创建一个外键字段,关联另一张表

  1. #设置on_delete,当删除某个年级,该年级的学生的grade字段显示'null'
  2. grade = models.ForeignKey('Grade', on_delete=models.SET_NULL, null=True)

example:班级表与学生表建立一对多的关系

  1. from django.db import models
  2. class Student(models.Model):
  3. name = models.CharField(max_length=20)
  4. age = models.SmallIntegerField(default=0)
  5. sex = models.SmallIntegerField(default=1)
  6. qq = models.CharField(max_length=20, unique=True, null=True)
  7. phone = models.CharField(max_length=30, unique=True, null=True)
  8. grade = models.ForeignKey('Grade', on_delete=models.SET_NULL, null=True)
  9. c_time = models.DateTimeField(verbose_name='报名时间', auto_now_add=True)
  10. e_time = models.DateTimeField(verbose_name='编辑时间', auto_now=True)
  11. def __str__(self):
  12. return '%s-%s' %(self.name, self.age)
  13. class Grade(models.Model):
  14. name = models.CharField(max_length=20, default='')
  15. num = models.CharField(max_length=20, default='')
  16. def __str__(self):
  17. return '%s-%s' %(self.num, self.name)
(3)ManyToMany

example:建立学生表与课程表的多对多关系

  1. from django.db import models
  2. class Student(models.Model):
  3. name = models.CharField(max_length=20)
  4. age = models.SmallIntegerField(default=0)
  5. sex = models.SmallIntegerField(default=1)
  6. qq = models.CharField(max_length=20, unique=True, null=True)
  7. phone = models.CharField(max_length=30, unique=True, null=True)
  8. c_time = models.DateTimeField(verbose_name='报名时间', auto_now_add=True)
  9. e_time = models.DateTimeField(verbose_name='编辑时间', auto_now=True)
  10. def __str__(self):
  11. return '%s-%s' %(self.name, self.age)
  12. # 多对多
  13. class Course(models.Model):
  14. name = models.CharField('课程名称', max_length=20, default='')
  15. students = models.ManyToManyField('Student', through='Enroll')
  16. # 没有"through='Enroll'",系统则自动创建第三张表"Course_Student",该表只有‘student’和‘course’两个字段;
  17. # 如果要添加其他字段,则要手动创建第三张表"Enroll",并设置"through='Enroll'"参数
  18. def __str__(self):
  19. return self.name
  20. class Enroll(models.Model):
  21. student=models.ForeignKey('Student', on_delete=models.CASCADE)
  22. course=models.ForeignKey('Course', on_delete=models.CASCADE)
  23. pay=models.FloatField('缴费金额', default='')
  24. c_time=models.DateTimeField('报名时间', auto_now_add=True)

Django入门--模型系统(二):常用查询及表关系的实现的更多相关文章

  1. 八.django模型系统(二)之常用查询及表关系的实现

    Ⅰ.常用查询  1.几个概念 每一个django模型类,都有一个默认的管理器,objects,查询就是依赖于objects管理器进行的(在创建时就被添加了). QuerySet表示数据库中对象的列表( ...

  2. Django入门--模型系统(一):模型基础

    1.Django的ORM介绍 对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不 ...

  3. Django框架基础知识07-常用查询及表关系的实现

    1.常用的模型字段类型 https://docs.djangoproject.com/en/2.1/ref/models/fields/#field-types 2.字段的常用参数 官方文档:http ...

  4. django模型系统二

    常用查询及表关系的实现 1.常用查询 每一个django模型类,都有一个默认的管理器 objects QuerySet表示数据库中对象的列表,它可以有0到多个过滤器.过滤器通过给定参数,缩小查询范围. ...

  5. Django中模型(二)

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

  6. Django入门实践(二)

    Django入门实践(二) Django模板简单实例 上篇中将html写在了views中,这种混合方式(指Template和views混在一起)不适合大型开发,而且代码不易管理和维护,下面就用Djan ...

  7. Django之模型层第二篇:多表操作

    Django之模型层第二篇:多表操作 一 表关系回顾 ​ 在讲解MySQL时,我们提到,把应用程序的所有数据都放在一张表里是极不合理的. ​ 比如我们开发一个员工管理系统,在数据库里只创建一张员工信息 ...

  8. Django之模型层第一篇:单表操作

    Django之模型层第一篇:单表操作 一 ORM简介 ​ 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(如增.删.改.查),而一旦谈到数据的管理操作,就需要用到数 ...

  9. python的Web框架,Django模型系统二,模型属性,及数据库进阶查询

    原始数据接上篇文章来操作.可能需要查看后才能懂.点击这里查看 1.常用的模型字段类型 官方文档:https://docs.djangoproject.com/en/2.1/ref/models/fie ...

随机推荐

  1. POJ 1166 The Clocks (暴搜)

    发现对这样的模拟题根本没啥思路了,本来准备用bfs的.可是结果超时了,这是參考别的人代码写的: #include <stdio.h> #include <iostream> # ...

  2. HDUOJ 水果

     /*水果 夏天来了~~好开心啊,呵呵,好多好多水果~~ Joe经营着一个不大的水果店.他觉得生存之道就是经营最受顾客欢迎的水果. 如今他想要一份水果销售情况的明细表,这样Joe就能够非常easy ...

  3. Storm集群组件和编程模型

     Storm工作原理: Storm是一个开源的分布式实时计算系统,常被称为流式计算框架.什么是流式计算呢?通俗来讲,流式计算顾名思义:数据流源源不断的来,一边来,一边计算结果,再进入下一个流. 比 ...

  4. phpfpm的配置

    1.php中fastcgi和php-fpm是什么东西 最近在研究和学习PHP的性能方面的知识,看到了factcgi以及php-fpm,发现我对他们是少之又少的理解,可以说几乎是一无所知,想想还是蛮可怕 ...

  5. Android端 配置极光推送

    由于业务须要,androidclient须要加推送.原来採用的百度推送.可是小米手机有时候收不到.后来换成了极光推送,极光的话全部设备都能收到推送,可是在高峰的时候会推迟.博主说的免费版的,收费的没用 ...

  6. SpringMVC实战(三种映射处理器)

    1.前言 上一篇博客,简单的介绍了一下SpringMVC的基础知识,这篇博客来说一下SpringMVC中的几种映射处理器机制. 2.三种映射处理器 2.1 BeanNameUrlHandlerMapp ...

  7. 黑马day01 笔记

    一.xml语法   1.文档声明     用来声明xml的基本属性,用来指挥解析引擎怎样去解析当前xml     通常一个xml都要包括而且仅仅能包括一个文档声明     xml的文档必须在整个xml ...

  8. 如何用ajax写分页查询(以留言信息为例)-----2017-05-17

    要写分页,首先你得清楚,一页你想显示多少条信息?如何计算总共显示的页数? 先说一下思路: (1)从数据库读取数据,以chenai表为例,读取所有留言信息.并能够实现输入发送者,可以查询该发送者的留言总 ...

  9. A - I Wanna Be the Guy

    Problem description There is a game called "I Wanna Be the Guy", consisting of n levels. L ...

  10. 多线程之HttpClient

    在程序用调用 Http 接口.请求 http 资源.编写 http 爬虫等的时候都需要在程序集中进行 Http 请求. 很多人习惯的 WebClient.HttpWebRequest 在 TPL 下很 ...