Django框架基础知识08-表关联对象及多表查询
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())
表关系的创建
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') 自动创建第三张表.
关联表的数据操作
OneToMany
正向 :一个模型如果定义了一个外键字段,通过这个模型操作外键 增删改查
反向 增删改查
-Many-to-Many 指定了中间表,add,remove,set 都不能用,必须用中间表 -One-to-One
跨表查询
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-表关联对象及多表查询的更多相关文章
- Django框架基础知识11-会话状态保持及表单
浏览器存储cookie的方式不太安全,那有没有更好些的来存储登入状态的方式呢??? 状态保持----cookie和session: 状态保持: 1.http协议是无状态的:每次请求都是一次新的请求,不 ...
- Django框架基础知识13-auth系统
我们昨天登录admin时创建的用户信息是存放在哪里了呢? auth系统的数据表: 从表的名称我们就能看出, auth_user,auth_group,auth_permission分别存放了用户,用户 ...
- Django框架基础知识09-请求与响应
视图函数接受到的request到底是个什么对象呢? HttpRequest对象: 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象视图函数的第一个参数是HttpRequest ...
- Django框架基础知识06-模型基础
1.数据库的连接配置 django 连接mysql的配置流程: 安装 pymysql pip install pymysql 创建数据库用户 有创建数据库权限的用户 创建数据库 crm 修改配置 se ...
- Django框架基础知识01-配置环境
Django框架 Django是个怎样的东西呢? Web应用框架----Django http服务器:用来接受用户请求,并将请求转发给web应用框架进行处理. Web应用框架处理完以后再发送给htt ...
- Django框架基础知识07-常用查询及表关系的实现
1.常用的模型字段类型 https://docs.djangoproject.com/en/2.1/ref/models/fields/#field-types 2.字段的常用参数 官方文档:http ...
- Django框架基础知识12-中间件及上下文处理器
Django中间件(Middleware) 是一个轻量级.底层的“插件”系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出. django 中的中间件(middleware) ...
- Django框架基础知识10-内置分页系统
from django.shortcuts import render, redirect, reversefrom datetime import datetime# Create your vie ...
- Django框架基础知识05-自定义模板标签与过滤器
根据一定规则,自己定义出符合需求功能的.用在任何你有需求的地方,因为内置的满足不了我们的需求,不同的东西有不同的定义规则 目前最最重要的就是HOW 一 文件路径配置: templates 存放自定义 ...
随机推荐
- 水题 Codeforces Round #304 (Div. 2) A. Soldier and Bananas
题目传送门 /* 水题:ans = (1+2+3+...+n) * k - n,开long long */ #include <cstdio> #include <algorithm ...
- 递推DP HDOJ 5092 Seam Carving
题目传送门 /* 题意:从上到下,找最短路径,并输出路径 DP:类似数塔问题,上一行的三个方向更新dp,路径输出是关键 */ #include <cstdio> #include < ...
- fscanf
fscanf (PHP 4 >= 4.0.1, PHP 5, PHP 7) fscanf — 从文件中格式化输入 说明 mixed fscanf ( resource $handle , str ...
- fgetcsv()函数
fgetcsv()函数.fgetcsv()函数可以读取指定文件的当前行,使用CSV格式解析出字段,并返回一个包含这些字段的数组.语法格式如下:array fgetcsv(resource $handl ...
- Hash环/一致性Hash原理
当前,Memcached.Redis这类分布式kv缓存已经非常普遍.从本篇开始,本系列将分析分布式缓存相关的原理.使用策略和最佳实践. 我们知道Memcached的分布式其实是一种“伪分布式”,也就是 ...
- Object类的几个方法
1.protected Object clone()创建并返回此对象的一个副本. 2. boolean equals(Object obj)指示其他某个对象是否与此对象“相等”. 3. protect ...
- Java报表之JFreeChart
一.JFreeChart简介 JFreeChart是JAVA平台上的一个开放的图表绘制类库.它完全使用JAVA语言编写,是为applications,servlets以及JSP等使用所设计. JFre ...
- 开发原生安卓cordova插件(基础)
cordova应用如果需要调用原生安卓接口,方法是使用cordova插件,cordova官方提供了主流原生功能的插件,但如果还不能满足需求,也可以自己开发cordova插件 以下介绍开发一个最简单的插 ...
- iframe 完全跨域自适应高度
1.跨域访问页面, 需要访问后台的页面,通过后台调转 2.跨域自适应宽高 思路:通过相互嵌套,获取跨域页面的高度,通过src传回到本域,通过parent方法设置主页的iframe的高度 index ...
- UI常用字体定义和继承的实例,ResearchKitCode
#import <UIKit/UIKit.h> @interface UIFont (APCAppearance) + (UIFont*) appRegularFontWithSize: ...