建表

class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField() # 与AuthorDetail建立一对一的关系
ad = models.OneToOneField(to="AuthorDetail") class AuthorDetail(models.Model):
birthday = models.DateField()
telephone = models.BigIntegerField()
addr = models.CharField(max_length=64) class Publish(models.Model):
name = models.CharField(max_length=32)
city = models.CharField(max_length=32)
email = models.EmailField() class Book(models.Model): title = models.CharField(max_length=32)
publishDate = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2)
keepNum = models.IntegerField()
commentNum = models.IntegerField() # 与Publish建立一对多的关系,外键字段建立在多的一方
publish = models.ForeignKey(to="Publish", to_field="nid") # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表
authors = models.ManyToManyField(to='Author')

可以看到表结构中有三个关联字段

# 与AuthorDetail建立一对一的关系
ad = models.OneToOneField(to="AuthorDetail") # 与Publish建立一对多的关系,外键字段建立在多的一方
publish = models.ForeignKey(to="Publish", to_field="nid") # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表
authors = models.ManyToManyField(to='Author')

基于对象查询(子查询)

一对多:

正向查询按字段:publish
Book------------------------>Publish
<------------------------
反向查询按表名小写_set

多对多:
正向查询按字段:authors
Book------------------------>Author
<------------------------ 
反向查询按表名小写_set

一对一 
正向查询按字段:ad
Author---------------------->AuthorDetail
<---------------------  
反向查询按表名小写

示例:

#########################单表查询

# 1 查询id为1 的书籍的价格
# Book.objects.filter(id=1).values("price") ##========================================多表查询======================= ##############################基于对象的多表查询######################################
#################一对多 # 查询python这本书的出版社的城市和email
# book_obj=Book.objects.filter(title="python").first()
# print(book_obj.publish.email,book_obj.publish.city)
# 查询北京出版社出版社过得所有书籍名称
# publish_obj=Publish.objects.filter(name="南京出版社").first()
# book_list=publish_obj.book_set.all() # Queryset[obj,obj]
# for obj in book_list:
# print(obj.title) #################多对多 # 查询go书籍的作者名称和年龄
# book_obj=Book.objects.filter(title="go").first()
# author_list=book_obj.authors.all()
# for obj in author_list:
# print(obj.name,obj.age) # alex出版过得所有书籍的名称和价格
# author_obj=Author.objects.filter(name="alex").first()
# book_list=author_obj.book_set.all()
# for obj in book_list:
# print(obj.title,obj.price) #################一对一 # 查询alex的电话号码
# author_obj = Author.objects.filter(name="alex").first()
# print(author_obj.ad.telephone)
# # 查询电话号码以123开头的作者名称
# ad_obj=AuthorDetail.objects.filter(telephone__startswith=123).first()
# print(ad_obj.author.name)

基于Queryset查询(join查询)

正向查询按字段
反向查询按表名小写

##############################基于QuerySet和双下划线的多表查询############################

#################一对多
# 查询python这本书的出版社的城市和email
# ret=Book.objects.filter(title="python").values("publish__city","publish__email")
# print(ret)
'''
values("publish__city"): book_list=Book.objects.filter(title="python")
temp=[]
for obj in book_list:
d={}
d["publish__city"]=obj.publish.city
d["publish__email"]=obj.publish.email
temp.append(d) return temp # <QuerySet [{'publish__city': '北京', 'publish__email': '123'}]> '''
# 查询北京出版社出版社过得所有书籍名称 # ret=Publish.objects.all().values("book__title")
# #Book.objects.all()
# print(ret)
'''
publish_list=Publish.objects.filter(name="北京出版社") temp=[]
for obj in publish_list: book_list=obj.book_set.all()
for book in book_list:
d={}
d["book__title"]=book.title
temp.append(d)
return temp ''' #################多对多 # 查询go书籍的作者名称和年龄
ret=Book.objects.filter(title="go").values("authors__name","authors__age")
ret=Book.objects.filter(title="go").values_list("authors__name","authors__age")
print(ret)# [('alex', 33), ('egon', 38)]> # alex出版过得所有书籍的名称和价格
#ret=Author.objects.filter(name="alex").values("book__title","book__price") #################一对一 # 查询alex的电话号码
#ret=Author.objects.filter(name="alex").values("ad__telephone")
# 查询电话号码以123开头的作者名称
# ret=AuthorDetail.objects.filter(telephone__startswith=123).values("author__name")
# print(ret) #====================================== 扩展查询==================== #查询python这本书的出版社的城市和email
ret=Book.objects.filter(title="python").values("publish__city")
ret=Publish.objects.filter(book__title="python").values("email","city") #查询go书籍的作者名称和年龄
ret=Book.objects.filter(title="go").values("authors__name", "authors__age")
Author.objects.filter(book__title="go").values("name","age") ################################聚合和分组###############################################
################################聚合
# 查询所有书籍中最高的价格
# select Max("price") from book
ret=Book.objects.all().aggregate(m=Max("price"))
print(ret) # {"price__max":123]
################################分组 # 每一个出版社出版过得书籍的最高价格
ret=Publish.objects.all().annotate(m=Max("book__price")).values("name","m")
print(ret)
# 每一个作者出版过的书籍的个数
ret=Author.objects.all().annotate(c=Count("book")).values("name","c")

django-ORM复习补充的更多相关文章

  1. Django ORM操作补充

    操作补充 only 只取某些去除其他 defer 去除某些取其他 # 需求: 只取某n列 queryset=[ {},{}] models.User.objects.all().values( 'id ...

  2. django orm 及常用参数

    一些说明: 表myapp_person的名称是自动生成的,如果你要自定义表名,需要在model的Meta类中指定 db_table 参数,强烈建议使用小写表名,特别是使用MySQL作为后端数据库时. ...

  3. Django ORM中常用字段和参数

    一些说明: 表myapp_person的名称是自动生成的,如果你要自定义表名,需要在model的Meta类中指定 db_table 参数,强烈建议使用小写表名,特别是使用MySQL作为后端数据库时. ...

  4. python 终级篇 django ---ORM操作

                                       一般操作                                                          必会的 ...

  5. django -orm操作总结

    前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MyS ...

  6. Django学习笔记之Django ORM相关操作

    一般操作 详细请参考官方文档 必知必会13条 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <> ...

  7. Django ORM哪些操作

    一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 ...

  8. [oldboy-django][2深入django]ORM操作

    推荐学习博客:http://www.cnblogs.com/wupeiqi/articles/6216618.html 需求: 汇总django orm操作,代替原生mysql语句来操作数据库:里面内 ...

  9. Django ORM 那些相关操作

    Django ORM 那些相关操作 一般操作 必知必会13条 <> all(): #查询所有的结果 <> filter(**kwargs) # 它包含了与所给筛选条件相匹配的对 ...

  10. Django ORM操作及进阶

    一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 ...

随机推荐

  1. 元器件封装标准IPC-7351

    IPC-7351依赖久经考验的数学算法,综合考虑制造.组装和元件容差,从而精确计算焊盘图形.该标准以IPC-SM-782研发概念为基础进一步提高,对每一个元件都建立了三个焊盘图形几何形状,对每一系列元 ...

  2. 再来一个expect脚本

    [root@jenkins scripts]# cat expect_test1205.sh #!/usr/bin/expect ################################### ...

  3. 第二百一十一节,jQuery EasyUI,ValidateBox(验证框)组件

    jQuery EasyUI,ValidateBox(验证框)组件 学习要点: 1.加载方式 2.属性列表 3.方法列表 4.自定义验证 本节课重点了解 EasyUI 中 ValidateBox(验证框 ...

  4. 【BZOJ】3402: [Usaco2009 Open]Hide and Seek 捉迷藏(spfa)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3402 又是spfa水题.. #include <cstdio> #include < ...

  5. QT软件初次使用中遇到的若干问题及思考

    1.QT窗口名称汉字设置问题? 答案:在MSVC中试用诸多方法,亲测都不行. 解决方案1:创建项目时,选择使用MSGW方案,用gcc进行编译,即可解决 2.QT中ui文件中组件不能再.cpp文件中显示 ...

  6. (转)Unity笔记之编辑器(UnityEditor)

    在使用unity3d的过程中,时常会需要从场景中寻找或者调用一个对象,而Unity就提供了一个贴心的功能——拖拽.用鼠标拖一下中比写堆代码直观的多吧!但是Unity提供的远远不止这一丢丢,下面我们来简 ...

  7. 一次显式GC导致的High CPU问题处理过程(转)

    项目现场反馈系统出现性能问题,具体表现为:所有的客户端响应极其卡顿. 第一反应推测,难道是DB层面出现阻塞?检查v$session会话状态及等待类型未见异常,应该可以排除DB层面原因导致的可能. 继续 ...

  8. select标签设置只读的方法(下拉框不可选但可传值)

    1. <select id="s1" name="s1" onfocus="this.defaultIndex=this.selectedInd ...

  9. zoj3659(经典并查集)

    这种思想很经典. 从最小的边选择,那么可以知道的是,在除去这条边的另外两个联通块,选其中一块中的点做为源点到另一块所得到的费用和. 如果你已经知道了这两个联通块内部选一个点时的最大费用和.那么这题就可 ...

  10. Dropdownlist中用viewmodel传值处理方法

    背景:MVC框架,页面使用razor语法,下拉框的话使用了@Html.DropDownList(),以前传值使用viewdata,但是我们老大说这个方式比较low,希望我可以使用viewmodel的方 ...