ORM跨表查询

首先,在项目中添加我们要查询的模型,并插入数据

在django根目录下创建一个查询的py文件,供我们测试

ORM跨表查询可以分为基于  对象的查询(子查询)  和基于 queryset(双下划线__) 的查询

基于对象的查询(子查询)

一对多的查询

正向查询:在有关联字段的表向被关联的表查询

一对多的正向查询(正向查询按字段)

查询名为 python开天辟地 这本书的出版社的邮箱

book_obj = models.Book.objects.filter(title="python开天辟地").first()
print(book_obj.publish.email)

一对多的反向查询(先查出1的这个对象,然后表名小写_set,查询与这个对象关联的对象)

查询名为朝阳门的出版社出版过的所有书籍名称

publish_obj = models.Publish.objects.filter(name="朝阳门出版社").first()
for book in publish_obj.book_set.all():
    print(book.title)

多对多的查询

多对多的正向查询

查询名为python开天辟地的这本书的作者的年龄

book_obj = models.Book.objects.filter(title="python开天辟地").first()
for author in book_obj.author.all():
    print(author.name,author.age)

多对多的反向查询

查询作者呲花出版的所有书籍的名字

author_obj = models.Author.objects.filter(name="呲花").first()
for book in author_obj.book_set.all():
    print(book.title)

一对一的查询

一对一正向查询

查询作者狗城的手机号

author_obj = models.Author.objects.filter(name="狗城").first()
print(author_obj.authorDetail.telephone)

一对一反向查询

查询手机号是17777777777的作者是谁(一对一反向查询,直接表名就可以,不用跟_set)

authordetail_obj = models.AuthorDetail.objects.filter(telephone=17777777777).first()
print(authordetail_obj.author.name)

基于queryset的查询

本质上是join关联表查询

一对多的正向查询(字段加__要查询的属性)

查询书名python开天辟地这本书的出版社的邮箱

models.Book.objects.filter(title="python开天辟地").values("publish__email")

一对多的反向查询(values里边要查询的表名小写加__要查询的属性)

查询名为朝阳门的出版社出版过的所有书籍名称

方式一:

book_list = models.Publish.objects.filter(name="朝阳门出版社").values("book__title")
for book in book_list:
    print(book["book__title"])

方式二:

book_list = models.Book.objects.filter(publish__name="朝阳门出版社").values("title")  # 过滤所有书籍里出版社的名字
for book in book_list:
    print(book["title"])

查询手机号以177开头的作者出版的书籍以及书籍对应的出版社名称

这种多表关联查询,首先定位基表(book),然后通过跨表双下划线,组合成一张大表,通过条件筛选

print(models.Book.objects.filter(author__authorDetail__telephone__startswith="177").values("title", "publish__name"))

原文地址:https://www.cnblogs.com/ligiao/p/11159273.html

时间: 2024-11-04 17:08:11

ORM跨表查询的相关文章

Django 【补充】ORM跨表查询补充

models.Book.objects.filter(**kwargs): querySet [obj1,obj2]models.Book.objects.filter(**kwargs).values(*args) : querySet [{},{},{}]models.Book.objects.filter(**kwargs).values_list(title) : querySet [(),(),()] 跨表查询总结: 1.创建表 class Book(models.Model): ti

跨表查询

跨表查询 一.ORM 跨表查询 class Book(models.Model): title = models.CharField(max_length=32) publish = models.ForeignKey(to="Publish",to_field="id",on_delete=models.CASCADE) authors = models.ManyToManyField(to = "Author",related_name='b

ORM单表查询,跨表查询,分组查询

单表查询之下划线 models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11.22.33的数据models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in models.Tb1.objects.filter(name__contains="ven")

Django学习【第7篇】:Django之ORM跨表操作(聚合查询,分组查询,F和Q查询等)

django之跨表查询及添加记录 一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);     一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many). 创建一对一的关系:OneToOne("要绑定关系的表名") 创建一对多的关系:ForeignKey("要绑定关系的表名") 创建多对多的关系:ManyToMany(&qu

BBS--功能4:个人站点页面设计(ORM跨表与分组查询)

查询: 日期归档查询 1 date_format ============date,time,datetime=========== create table t_mul_new(d date,t time,dt datetime); insert into t_mul_new values(now(),now(),now()); select * from t_mul; mysql> select * from t_mul; +------------+----------+---------

Django之ORM跨表操作(聚合查询,分组查询,F和Q查询等)

一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);     一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many). 创建一对一的关系:OneToOne("要绑定关系的表名") 创建一对多的关系:ForeignKey("要绑定关系的表名") 创建多对多的关系:ManyToMany("要绑定关系的表名"

django(3) 一对多跨表查询、多对多

1.一对多跨表查询获取数据的三种形式:对象.字典.元组 例:有host与business两张表,host与business的id字段关联,business在host表中的对象名是b,  通过查询host表获取的querySet中的b来查询business表. 以下两种方式都是操作host表: a.以对象的形式跨表查询,查询business表的数据:row.b.caption,row.b.id b.以字典和元组的形式跨表查询,查询business表的数据,跨表查询的时候要用双下划线  'b__id

LeetCode:Combine Two Tables - 跨表查询

1.题目名称 Combine Two Tables(跨表查询) 2.题目地址 https://leetcode.com/problems/combine-two-tables/ 3.题目内容 现在有两张表Person和Address,它们的表结构如下: 表Person: +-------------+---------+ | Column Name | Type    | +-------------+---------+ | PersonId    | int     | | FirstNam

ORM::联表查询

按顺序来一步一步走: 第一先建立好数据库:我的数据库是mysql数据库,数据库共分为以下几个表: users  用户表(刚开始的时候我用的是user表名,由于kohana有喜欢建立model时在后面加复数的习惯,但是估计 user这个名字已经被占用了,指定$_table_name="user"也不行) posts 帖子 数据库导出代码如下: -- phpMyAdmin SQL Dump -- version 3.4.10.1deb1 -- http://www.phpmyadmin.n