多表查询是模型层的重要功能之一, Django提供了一套基于关联字段独特的解决方案....提供了一种使用双下划线__的查询语法: >>> Entry.objects.filter(blog__name='Beatles Blog') 反向查询 被索引的关系模型可以访问所有参照它的模型的实例,...如Entry.blog作为Blog的外键,默认情况下Blog.entry_set是包含所有参照Blog的Entry示例的查询集,可以使用查询集API取出相应的实例。...ManyToManyField 字段的模型的外键名称(本例中为group),field2 为指向目标模型的外键的名称(本例中为person)....反向查询: >>>a = Person.objects.get(id=1) >>>a.group_set.all() 同样related_name可以设置反向查询集的名称。
,第一个field是自增的主键,其余两个field一般就是引用两张表的外键。...正式基于此,Django将这种一般话的行为封装起来,方便大家使用。 下面我们引用Publication和Article之间的多对多的关系进行举例分析Django中的用法。...当然,Django也想到了,因此提供了反向查询的方法: >>> p2.article_set.all() [] 这里article_set就是提供反向查询的默认属性...在Hibernate中双向映射关系也使用了xxxxset关键字作为反向查询入口。...其余操作数据库的操作如field ,get,delete,update在上面基于查询的结果集QuerySet上进行相应的操作,详细可参考Django文档。
来创建数据库中的列名 3.外键字段ForeignKey有一个null=True的设置,你可以赋给它空值None 二.添加表记录 一对一: # 方式一: detail_obj = models.AuthorDetail.objects.filter...传递的参数必须是可迭代对象,一般为列表,列表内可以是对象,也可以是id book.authors.set() 三.基于对象的跨表查询 一对一查询 正向查询(按字段:authordetail) # 查询作者姓名为...所有Django为我们提供了F表达式来完成这类操作 导入包: from django.db.models import F 如:查询comment_num数量大于read_num的书籍 models.Book.objects.filter...如:将read_num的数量乘以二 models.Book.objects.all().update(read_num=F('read_num')*2) Q查询 filter()等方法种的关键字参数查询都是通过逗号来实现...'AND'的,如果需要执行复杂的查询,就需要使用Q对象 导入包:from django.db.models import Q 可以使用"&"或者"|"或者"~"来组合Q对象,分别表示与,或,非逻辑 如:
在Django中具体的对应方式为: 类名对应数据库中的表名 类名对应数据库中的表名 类属性对应数据库里的字段 类实例对应数据库表里的一行数据 类实例对象的属性对应这行中的字段的值 一.数据库的连接 Django...表示多对多的关系。 除了这种方式也可以手动创建一个表,手动添加两个外键来实现多对多。...2.删除 1.删除普通表信息 先找到,再删除 student1=student.objects.filter(id=1)[0].delete() 由于django的级联删除,其他表中如student_teacher...field): 对查询结果排序 reverse(): 对查询结果反向排序 distinct(): 从返回结果中剔除重复纪录 values_list(*field): 它与values()非常相似,它返回的是一个元组序列...2.QuerySet对象 查询的结果集就是一个QuerySet对象 QuerySet对象就像是一个列表,列表存储着查询出的结果,可以迭代,可以切片 Django中QuerySet对象是惰性的,即你得到这个对象的时候并没有真正的在数据库中执行
,使用的字段名,用于代替 【表名_set】 如: obj.表名_set.all() related_query_name=None, # 反向操作时,使用的连接前缀,用于替换【表名...=None, # 反向操作时,使用的连接前缀,用于替换【表名】 如: models.UserGroup.objects.filter(表名__字段名=1).values('表名__字段名'...根据日期获取查询集 datetimes() 根据时间获取查询集 none() 创建空的查询集 union() 并集 intersection...Q查询 F查询专门取对象中某列值的操作,F的作用:用来批量修改数据的 #导入F from django.db.models import F #把table1表中的num列中的每一个值在的基础上加10...__gt=4 九、实例 1、Django的ORM中如何判断查询结果是否为空,判断django中的orm为空 result= Booking.objects.filter() 方法一 .exists()
(ManyToManyField):在第三张关系表中新增数据 ORM 修改数据 ORM 删除和清空数据 跨表查询 基于对象的跨表查询 基于双下划线的跨表查询 聚合查询 示例 F查询 Q查询 Django...ORM 多表操作 表模型 图书表 出版社表 作者表 作者详情表 表关系 一对一:一对一推荐建在查询频率高的一方 一对多:外键字段建在多的一方 多对多:外键字段建在查询频率多的一方,在Django第三张表不需要创建...(常用) 一对多中,设置外键属性的类(多的表)中,MySQL 中显示的字段名是:外键属性名_id。...,就是正向 反向:从没有外键表去查另外相关联的表,就是反向 口诀: 正向查询按外键字段 反向查询按表名小写 注意: 正向:属性名 反向:小写类名加 _set 反向查询的时候查询的对象可能有多个的情况加_..._set,查询的对象只有一个的情况不需要加 基于对象的跨表查询 '''子查询思路''' 1、先查出一个对象 2、基于对象正反查 '''基于对象的跨表查询:正向''' 1.查询三国演义书籍对应的出版社名称
可以使用双下划线对OneToOne、OneToMany、ManyToMany进行关联查询和反向关联查询,而且方法都是一样的,如: >>> Entry.objects.filter(blog__name=...OneToOne的关系也是这样关联查询,可以看到,Django对OneToOne、OneToMany、ManyToMany关联查询及其反向关联查询提供了相同的方式,真是牛逼啊。...中的实现 在SQL中,很多关键词在删、改、查时都是可以用的,如order by、 like、in、join、union、and、or、not等等,我们以查询为例,说一下django如何映射SQL的这些关键字的...聚合函数可以像filter那样关联表,即在聚合函数中,Django对OneToOne、OneToMany、ManyToMany关联查询及其反向关联提供了相同的方式,见下面例子。...fields passed to select_related(),QuerySet中的元素中的OneToOne关联及外键对应的是都是关联表的一条记录,如my_entry=Entry.objects.get
一、Django实现表与表的关联 以图书管理系统为例我们在数据库建立四张表:图书表、出版社表、作者表、作者信息,这里表与标的对应关系如下: 表 表 对应关系 出版社 图书 一对多 作者 图书 多对多 作者信息...外键字段建在任意一方都可以,但是建议建在查询频率较高的那一方 author_detail = models.OneToOneField(to='Author_detail') # fk +...,建议建在查询频率高的一方 一对多外键字段创建的时候同步到数据中表字段会自动加_id后缀,如果我们手动加了_id orm也会在给我们加一次,所以我们这里不要加_id 多对多关系,django orm会自动帮我们创建书籍和作者的第三张关系表...3.9Django1.x和2.x的版本的路由层区别 1.Django2.x中默认的url通过path接收,path的第一个输入值不是正则表达式,里面写的是什么就按什么匹配。...urlpatterns = [ path('admin/', admin.site.urls), ] 2.Django2.x中的re_path对应的是Django1.x中的url功能相同。
删除单个MyModel对象或删除一个查询结果集(QuerySet)中的全部对象都是调用 delete()方法 删除单个对象 步骤 查找查询结果对应的一个数据对象 调用这个数据对象的 delete ()...方法实现删除 示例: try: auth = Author.objects.get(id=1) auth.delete() except: print(删除失败) 删除查询结果集...') print(wife.name, '的老公是', wife.author.name) 反向查询 通过反向关联属性查询 反向关联属性为实例对象.引用类名(小写),如作家的反向引用为作家对象.wife...的出版社是:', abook.publisher.name) 通过 Publisher 查询 对应的所有的 Book 【反向】 Django会在Publisher中增加一个属性来表示对对应的Book们的查询引用...获取book对应的作者中年龄大于80岁的作者的信息 通过 Author 查询对应的所有的 Book【反向】 Django 会生成一个反向属性 book_set 用于表示对对应的 book 的查询对象相关操作
对象关系映射,是随着面向对象思想发展而产生的,是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换,面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的...() 查询集 查询集表示从数据库中查询到的对象集合 返回查询集的过滤器 all():返回所有数据 filter(): 返回满足条件的数据 exclude(): 返回不满足条件的数据 order_by()...): 返回当前查询结果的总条数 aggregate(): 聚合,返回一个字典 判断一个查询集中是否有数据 两个特性 惰性 创建查询集不会访问数据库,直到调用数据时,才会访问数据库 缓存 使用同一个结果集...,第一次使用会触发查询数据库,然后将结果缓存下载,再次使用直接调用缓存 限制结果集 可以对结果集进行切片操作,等同于数据库中的分页操作,但是不支持负数 list = BookInfo.objects.all...() 清除session数据,在存储中删除session的整条数据 request.session.flush() 删除session中的指定键及值,在存储中只删除某个键及对应的值 del request.session
注意事项: 表的名称myapp_modelName,是根据 模型中的元数据自动生成的,也可以覆写为别的名称 id 字段是自动添加的 对于外键字段,Django 会在字段名上添加"_id" 来创建数据库中的列名... 这个例子中的CREATE TABLE SQL 语句使用PostgreSQL 语法格式,要注意的是Django 会根据settings 中指定的数据库类型来使用相应的SQL 语句。 ...定义好模型之后,你需要告诉Django _使用_这些模型。你要做的就是修改配置文件中的INSTALL_APPSZ中设置,在其中添加models.py所在应用的名称。...基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系。...如果我们要对两个字段的值做比较,那该怎么做呢? Django 提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。
1、无需连表查询性能低,省硬盘空间(选项不固定时用外键) 2、在modle文件里不能动态增加(选项一成不变用Django的choice) 其他字段 db_index = True 表示设置索引 unique...(查询结果集对象),它并不会马上执行sql,而是当调用QuerySet的时候才执行。...中的orm的时候,我们可以把一对多,多对多,分为正向和反向查找两种方式。...正向查找:ForeignKey在 UserInfo表中,如果从UserInfo表开始向其他的表进行查询,这个就是正向操作,反之如果从UserType表去查询其他的表这个就是反向操作。...('UserType') 到B表(注意外键表名加引号) 就意味着 写在写A表的B表主键,(一列),代表B表的多个(一行)称为1对多, 查询 总结:利用orm获取 数据库表中多个数据 获取到的数据类型本质上都是
通过逻辑将A、B表进行连表查询,不会有任何异常。如两张表建立了一对一外键字段,外键在A表,那么先往B表写数据就更合理。...更合理) """ Django orm中外键字段属性详解 在建表之前我们对外键字段属性进行了解: 1)related_name在外键中设置外键反向查询的字段名:正向找字段名,反向找related_name...值,related_name的默认值是表名小写 + _set,这就是为什么在Django中跨表反向查询时我们使用表名小写 + _set去查另一张表的数据。...,将两张表设置为级联,并将外键反向查询的字段名设置为detail 数据库中脏数据介绍 数据库中常见的并发操作所带来了一致性问题包括:丢失的修改,不可重复读,读“脏”数据,幻读。...子序列化 Django中的子序列化的功能是:通过跨表查询数据然后对跨表查到的数据反序列化。
(查询结果集对象),它并不会马上执行sql,而是当调用QuerySet的时候才执行。...中的orm的时候,我们可以把一对多,多对多,分为正向和反向查找两种方式。...正向查找:ForeignKey在 UserInfo表中,如果从UserInfo表开始向其他的表进行查询,这个就是正向操作,反之如果从UserType表去查询其他的表这个就是反向操作。...aggregate()中每一个参数都指定一个包含在字典中的返回值。即在查询集上生成聚合。...此时Django为我们提供了F和Q查询: 1、F 可以获取对象中的字段的属性(列),并对其进行操作; from django.db.models import F,Q #F 可以获取对象中的字段的属性
深入模型 在上一个章节中,我们提到了Django是基于MVC架构的Web框架,MVC架构追求的是“模型”和“视图”的解耦合。所谓“模型”说得更直白一些就是数据(的表示),所以通常也被称作“数据模型”。...,所以也能通过部门反向查询该部门的员工(从一对多关系中“一”的一方查询“多”的一方),反向查询属性默认的名字是类名小写_set(如上面例子中的emp_set),当然也可以在创建模型时通过ForeingKey...的related_name属性指定反向查询属性的名字。...:基于like的模糊查询 in:集合运算 gt / gte / lt / lte:大于/大于等于/小于/小于等于关系运算 range:指定范围查询(SQL中的between…and…) year / month.../ iregex:基于正则表达式的模糊匹配查询 Q对象(用于执行复杂查询)的使用: >>> from django.db.models import Q >>> Emp.objects.filter(
使用 Django,只要很少的代码,Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容,并进一步开发出全功能的 Web 服务 Django 本身基于 MVC 模型,即 Model...字典 分组聚合 其实是为了实现Having语句 通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值,为查询集的每一项生成聚合 QuerySet.annotate(结果变量名(别名)=聚合函数...)) wife = Wife.objects.create(name=’王夫人’,author_id = 1(类属性字段绑值)) 一对一查询 正向查询:从外键查对象 反向查询:从对象查外键 调用反向属性查询到关联的一方...一对多查询 核心:正向属性(authors)和反向属性(book_set) 在多表上设置外键,关联一表。...核心:正向属性(authors)和反向属性(book_set) mysql中多对多需要用三张表实现 Django中无需手动创建第三张表,Django自动完成 创建字段语法:属性 = models.ManyToManyField
related_query_name 反向查询操作时,使用的连接前缀,用于替换表名。 on_delete 当删除关联表中的数据时,当前表与其关联的行的行为。...注意事项: 表的名称myapp_modelName,是根据 模型中的元数据自动生成的,也可以覆写为别的名称 id 字段是自动添加的 对于外键字段,Django 会在字段名上添加"_id" 来创建数据库中的列名...三 基于对象的跨表查询 跨表查询是分组查询的基础,F和Q查询是最简单的,所以认真学习跨表查询 一对多查询(Publish 与 Book) ? ...四 基于双下划线的跨表查询(基于join实现的) Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系。...''' 基于双下划线的查询就一句话:正向查询按字段,反向查询按表名小写用来告诉ORM引擎join哪张表,一对一、一对多、多对多都是一个写法,注意,我们写orm查询的时候,哪个表在前哪个表在后都没问题
="0dbccd1992474d30a4497b05295e807b") # 关联UserMit表中的user_id对应主键 一对一(查询数据) ---- 正向查询 正向查询:直接通过外键属性查询,则为外键查询...') 反向查询 没有外键属性的一方,可以调用反向属性查询到关联的另一方 反向关联的属性为实例对象.引用类名(小写) 当反向引用不存在的时候,则会触发异常 当UserId类中定义了外键约束...,"的班级是",stu.classroom.name) XiaoMing 的班级是 高二三班 反向查询[通过ClassRoom查询所有Student] class1 = ClassRoom.objects.get...: print(i.id,i.student_name,i.classroom_id) 多对多映射 ---- 多对多表达对象之间多对多的复杂关系,如:每个人都有不同的学校,每个学校都有不同的学生...MySQL中创建多对多需要以来第三张表来完成 Django中无需手动创建,Django自动完成 语法:在关联的两个类中的任意一个类中models.ManyToManyField(MyModel
添加表记录 基于对象的连表查询 一对一查询 一对多查询 多对多查询 连续跨表 打印Django查询数据的SQL语句 基于双下划线查询 聚合查询 分组查询 F查询...2.peewee ##优点: 1.Django式的API,使其易用 2.轻量实现,很容易和任意web框架集成 ## 缺点: 1.多对多查询写起来不直观 3.SQLAlchemy ## 优点:...正向查询:boook表里面有跟publish表的关联字段,从book表查询到publish表就叫做正向查询 反向查询:反过来,从publish表查询到book表中,就是反向查询 正向查询按字段,反向查询按表名小写...boook表里面有跟author表的关联字段,从book表查询到author表就叫做正向查询 反向查询:反过来,从author表查询到book表中,就是反向查询 正向查询按字段,反向查询按表名小写_set.all...正向:正向查询按字段 反向查询:反向按表名小写_set.all() 4******基于对象的查询,多次查询(子查询) 打印Django查询数据的SQL语句
myapp_modelName,是根据 模型中的元数据自动生成的,也可以覆写为别的名称 2、id 字段是自动添加的 3、对于外键字段,Django 会在字段名上添加"_id" 来创建数据库中的列名...对查询结果反向排序 distinct(): 从返回结果中剔除重复纪录 count(): 返回数据库中匹配查询(QuerySet)...是nid=1的书籍对象关联的出版社对象 反向查询(按表名:book_set): ?...() # 与人民出版社关联的所有书籍对象集合 基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系。...如果我们要对两个字段的值做比较,那该怎么做呢? Django 提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。 ?
领取专属 10元无门槛券
手把手带您无忧上云