1.自定义主键字段的创建 AutoFiled(pirmary_key=True) # 一般不会自定义,int类型,自增长 一般不自定义主键.

2.order_by asc desc

from django.db.models.function import Lower

res = Student.objects.order_by(Lower('name').desc())

  1. 表关系的创建

  • OneToOne student = models.OneToOneField('Student', on_delete=models.CASCADE) #一般情况下关联表名用字符串,防止无法读取Student这个类.

  • OneToMany grade = models.ForeignKey('Grade', on_delete=models.SET_NULL, null=True)

  • ManyToMany

  • class Cousrse(models.Model):

    • name = models.CharField('课程名称',max_length=20)

    • students = models.ManyToMany('Student') 自动创建第三张表.

  1. 关联表的数据操作

  • OneToMany

  • 正向 :一个模型如果定义了一个外键字段,通过这个模型操作外键 增删改查

  • 反向 增删改查

-Many-to-Many 指定了中间表,add,remove,set 都不能用,必须用中间表 -One-to-One

  1. 跨表查询

1.实现课堂上的5个关联表的关系 2.练习课堂上的案例

关系表中的数据操作:

进入项目目录的IDLE:

为了能方便学习,我们进入项目的idle中去执行我们的操作,

通过python manage.py shell 就能进入当前目录下的IDLE

1.进入IDLE

2.查看当前的目录路径

3.导入我们项目中的模型类

关系表的数据操作:

1.先往数据表department中添加数据.

2.查看数据表student的表结构.

department_id字段就是外键关联的department表中的d_id字段

一对多表关系数据的添加:

3.往数据表student中添加数据的第一种方式

s = Students()

In [6]: s.name = '石麒详'

In [7]: g1 = Grade.objects.first()

In [8]: g1 Out[8]: <Grade: Grade object (1)>

In [10]: s.grade = g1

In [11]: s.grade Out[11]: <Grade: Grade object (1)>

In [13]: s.save()

In [14]: s.grade Out[14]: <Grade: Grade object (1)>

4.往数据表student中添加数据的第二种方式

s1 = Student(name='二')

g2 = Grade.objects.last()

se.grade_id = g2.id

s2.save

这两种方式的效果是一样的.

1.第一种方式就是跟之前的一样,用传参的方法添加,需要注意的是外键的值必须是关联表中已经存在的值.

2.第二种方式是用的属性赋值的方式,因为我们在模型类有定义了一个department的属性,而这个属性的对象的类型必须是department表的类实例对象

删除:s2.grade = None

s2.save()

查:

s2.grade.name

s2.grade.num

表关联对象的访问:

Student的模型类中我们有定义department的属性,所以当我们去访问的时候,可以直接通过student.department的形式去找到某个学生的所属学院是哪个.

那么如果我们也希望在在访问某个学院的实现对象的学生的时候改怎么访问呢???

如果模型I有一个ForeignKey,那么该ForeignKey 所指的模型II实例可以通过一个管理器回前面有ForeignKey的模型I的所有实例。默认情况下,这个管理器的名字为foo_set,其中foo 是源模型的小写名称。

例子:g3.students_set <django.db.models.fields.related_descriptors.create_reverse_many_to_one_manager.<locals>.RelatedManager at 0x7f097b7a0b70>

g3.students_set.create(name='王五') 反向增加.

g3.students_set.add(s) #直接加入一个s对象

create,add,立刻马上操作数据库,add可以加多个

可以在定义时设置related_name 参数来覆盖foo_set 的名称.

添加了related_name的参数后,重新打开一个IDLE,

访问时就能直接用设置的参数作为属性了.

处理关联对象的一些方法:

add(obj1, obj2, ...) 添加的已经存在数据库的数据

添加一指定的模型对象到关联的对象集中。

1.d1.student的管理器有add的方法.

2.例子中的s2能添加成功是因为设置了student表中department字段允许为空了.

create(\kwargs) 添加不存在的数据 ,将数据直接存入数据库

创建一个新的对象,将它保存并放在关联的对象集返回新创建的对象。

remove(obj1, obj2, ...)

从关联的对象集中删除指定的模型对象。

删除的是关系表中的数据

因为我们有修改student表中的department_id字段允许为空,所以当删除的时候这个字段值为NULL.删除字段必须设置null为True

clear() 从关联的对象集中删除所有的对象

remove,clear是立刻马上执行.

g3.student_set.set([s,s2])

set方法先调用clear,然后添加

注意对于所有类型的关联字段,add()、create()、remove()和clear()都会马上更新数据库。换句话说,在关联的任何一端,都不需要再调用save()方法。

多表查询----跨关联关系的查询:

Django 提供一种强大而又直观的方式来“处理”查询中的关联关系,它在后台自动帮你处理JOIN。 若要跨越关联关系,只需使用关联的模型字段的名称,并使用双下划线分隔,直至你想要的字段:

例子:Students.objectt.filter(grade__name='django框架') #此sql语句用内连接完成查询.

查询学院名字为‘计算机学院’的学生的信息

Student.objects.filter(department__d_name='计算机学院')

它还可以反向工作。若要引用一个“反向”的关系,只需要使用该模型的小写的名称。

查询学生名字中包含 '小' 的学生的学院信息

Department.objects.filter(students_namecontains='小')

查询学号为1的学生所有的课程

Course.objects.filter(student__s_id=1)

查询报了课程1的所有的学生

Student.objects.filter(course__c_id=1)

查询报了'python'课程的的学生的所属学院的信息

Department.objects.filter(student--course--c_name='python')

ManyToMany

add,set,remove都是我们没有指定中间表时候使用.

只要是反向,就用模型的小写加--set.

ManyToManyField相当于一个管理器:

例子:c1.students.all()

通过ManyToManyField字段的介入,就可以不需要中间表进行查询.

OneToOne反向查询中不需要set,直接通过模型的小写调用一个对象,不是管理器.

例子:s1.studentdetail.college

查询性别为1的学生选择的课程

res = Course.objects.filter(students__sex=1)

查询选择python课程的学生:

Students.objects.filter(course--name--counatins='python')

查询选择了英语33期的学生

res = Students.objects.filter(course--name--contains='english',grade--num--contains='33')

查询报名学费小于3000的学生

Students.objects.filter(enroll--pay--lt=3000)

查询报名了python的学生所在的年级

Grade.objects.filter(student--course--name--contains='python')

在执行makemigrations的时候,django自动在数据库中创建一个django-migrations表,记录执行的迁移文件名,如果手动删除了迁移文件,再执行makemigrations时,生成的相同的迁移文件名不会执行.所以还要手动在django-migrations表中手动删除同名记录,才能执行migrate.但是数据库没有相应的回调,执行时会报错.

迁移回滚

python manage.py migrate teacher 0001 #最后是以前版本的迁移文件名

Students.objects.only('name') ,返回的是一个对象列表,可以索引取其他属性,提高效率.only查询id和name,再查询其他属性时又执行查询数据库.

Students.objects.values('name') ,返回的是一个QuerySet,只能索引取到name字典对象,不可以索引取其他属性

左连接查询的一个例子:

res = Students.object.values('name','grade--name') #左连接查询表的年级

Django框架基础知识08-表关联对象及多表查询的更多相关文章

  1. Django框架基础知识11-会话状态保持及表单

    浏览器存储cookie的方式不太安全,那有没有更好些的来存储登入状态的方式呢??? 状态保持----cookie和session: 状态保持: 1.http协议是无状态的:每次请求都是一次新的请求,不 ...

  2. Django框架基础知识13-auth系统

    我们昨天登录admin时创建的用户信息是存放在哪里了呢? auth系统的数据表: 从表的名称我们就能看出, auth_user,auth_group,auth_permission分别存放了用户,用户 ...

  3. Django框架基础知识09-请求与响应

    视图函数接受到的request到底是个什么对象呢? HttpRequest对象: 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象视图函数的第一个参数是HttpRequest ...

  4. Django框架基础知识06-模型基础

    1.数据库的连接配置 django 连接mysql的配置流程: 安装 pymysql pip install pymysql 创建数据库用户 有创建数据库权限的用户 创建数据库 crm 修改配置 se ...

  5. Django框架基础知识01-配置环境

    Django框架 Django是个怎样的东西呢? Web应用框架----Django  http服务器:用来接受用户请求,并将请求转发给web应用框架进行处理. Web应用框架处理完以后再发送给htt ...

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

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

  7. Django框架基础知识12-中间件及上下文处理器

    Django中间件(Middleware) 是一个轻量级.底层的“插件”系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出. django 中的中间件(middleware) ...

  8. Django框架基础知识10-内置分页系统

    from django.shortcuts import render, redirect, reversefrom datetime import datetime# Create your vie ...

  9. Django框架基础知识05-自定义模板标签与过滤器

    根据一定规则,自己定义出符合需求功能的.用在任何你有需求的地方,因为内置的满足不了我们的需求,不同的东西有不同的定义规则 目前最最重要的就是HOW 一 文件路径配置: templates 存放自定义 ...

随机推荐

  1. C++结构体的应用_YCOJ

    结构体是一种自定义的东西,用struct来定义.在他里面, 可以装许多东西,比如int,string,char,bool等等等等. 如: struct a{ string name; int a; i ...

  2. hadoop wordcount程序缺陷

    在wordcount 程序的main函数中,没有读取运行环境中的各种参数的值,全靠hadoop系统的默认参数跑起来,这样做是有风险的,最突出的就是OOM错误. 自己在刚刚学习hadoop编程时,就是模 ...

  3. Luogu P1141 01迷宫【搜索/dfs】By cellur925

    题目传送门 我tm到现在还需要刷这种水搜索...我退役吧. 但就是搜索弱嘛 补一补嘛qwq 题目大意:给你一张地图与许多询问,每次询问求这个点所在联通块的点的个数. 所以这个题目的本质就是在求联通块. ...

  4. Spring自动扫描注解类的冲突问题

    原文地址:http://www.blogjava.net/crazycy/archive/2014/07/12/415738.html Spring MVC项目中通常会有二个配置文件,spring-s ...

  5. 数据库sql 使用 lag 和OVER 函数和 like 使用 小技巧

    1. sample 1: Lag()就是取当前顺序的上一行记录.结合over就是分组统计数据的.Lag()函数,就是去上N行的字段的数据. SQL> select * from x; A---- ...

  6. Backbone学习记录(4)

    事件绑定  on()方法 调用格式:object.on(event, callback, [context])"change" — 当attributes变化时"chan ...

  7. P1554 梦中的统计

    题目背景 Bessie 处于半梦半醒的状态.过了一会儿,她意识到她在数数,不能入睡. 题目描述 Bessie的大脑反应灵敏,仿佛真实地看到了她数过的一个又一个数.她开始注意每一个数码(0..9):每一 ...

  8. List的深度copy和浅度拷贝

    List<Student> list= Arrays.asList( new Student("Fndroid", 22, Student.Sax.MALE, 180) ...

  9. elasticsearch 2.4.0安装说明

    首先从官网下载安装包,是个压缩文件,然后解压 在es目录下找到es的配置文件 修改集群(cluster)名称 PS:一般情况下一台机只部署一个es程序,也就是一个集群,默认集群名是ewater_mai ...

  10. python pandas 中 loc & iloc 用法区别

    转自:https://blog.csdn.net/qq_21840201/article/details/80725433 ### 随机生DataFrame 类型数据import pandas as ...