Django之Models(三)

创建多对多关系

第一种方式:创建多对多的关系authors=models.ManyToManyField("Author")

class Publisher(models.Model):
name = models.CharField(max_length=30)
city = models.CharField('城市',max_length=60) class Book(models.Model):
name=models.CharField(max_length=20)
price=models.IntegerField()
pub_date=models.DateField()
publisher= models.ForeignKey(Publisher,on_delete=models.SET)
authors=models.ManyToManyField("Author") class Author(models.Model):
name=models.CharField(max_length=32)
address=models.CharField(max_length=32)

第二种方式:手动创建第三张表,不推荐

class Publisher(models.Model):
name = models.CharField(max_length=30)
city = models.CharField('城市',max_length=60) class Book(models.Model):
name=models.CharField(max_length=20)
price=models.IntegerField()
pub_date=models.DateField()
publisher= models.ForeignKey(Publisher,on_delete=models.SET) class Author(models.Model):
name=models.CharField(max_length=32)
address=models.CharField(max_length=32) class Book_Author(models.Model):
book=models.Foreignkey('Book')
author=models.Foreignkey('Author')

补充:

如果想向第三张表插入的方式绑定关系:手动创建第三张表

关联字段
Book_Author.objects.create(book_id=2,authos_id=3) book_obj=Book.objects.get(id=2)
#借助第三张表来查询关联信息
print(book_obj.Book_author_set.all()[0].author) lili出过的书籍名称及价格
第三张表_关联表_字段
Book.objects.filter(book_author_author_name="lili")

绑定多对多关系

book_obj=Book.objects.get(id=2)
authoor_obj=Author.objects.get(id=2)
book_obj.authors.add(author_obj) book_obj=Book.objects.get(id=2)
authoor_objs=Auther.objects.all()
book_obj.authors.add(*author_objs)

  

解除多对多关系

book_obj=Book.objects.get(id=2)
authoor_objs=Auther.objects.all()
book_obj.authors.remove(*author_objs) book_obj=Book.objects.get(id=2)
authoor_obj=Author.objects.get(id=2)
book_obj.authors.remove(authoor_obj)

  

查询数据

对象查询:

获取id为3的书籍的作者信息
book_obj=Book.objects.get(id=3)
book_obj.authors.all() 获取id为2的作者写的书的信息
author_obj=Author.objects.get(id=2)
author_obj.book_set.all()

  

掌握:通过 filter values (双下划线)进行多对多的关联查询

#正向查找(条件)之多对多
ret1=models.Book.objects.filter(name='python').values('author__name')
print(ret1)
ret2=models.Book.objects.filter(author__name="lili").values('name')
print(ret2) #反向查找之多对多:
ret3=models.Author.objects.filter(book__name='python').values('name')
print(ret10)

聚合与分组

聚合 

先导入:from django.db.models import Avg,Min,Max,Count

ggregate(*args,**kwargs):
通过对QuerySet进行计算,返回一个聚合值的字典。aggregate()中每一个参数都指定一个包含在字典中的返回值。即在查询集上生成聚合。 ret1=Book.object.all().aggregate(Avg('price'))
print(ret1) ret2=ret1=Book.object.all().aggregate(Sum('price'))
print(ret2) Book.objects.filter(authors_name="lili").aggregate(Sum("price")) Book.objects.filter(authors_name="lili").aggregate(lili_money=Sum("price")) Book.objects.filter(authors_name="lili").aggregate(Count('price')) 分组
annotate(*args,**kwargs):
可以通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合。 Book.objects.values("authors_name").annotate(Sum("price")) Publish.objects.values('name').annotate(Min("book_price"))

Django之Models(三)的更多相关文章

  1. Django的Models(三)

    ORM操作的一些进阶的方法: ################################################################## # PUBLIC METHODS T ...

  2. 第三百零九节,Django框架,models.py模块,数据库操作——F和Q()运算符:|或者、&并且——queryset对象序列化

    第三百零九节,Django框架,models.py模块,数据库操作——F()和Q()运算符:|或者.&并且 F()可以将数据库里的数字类型的数据,转换为可以数字类型 首先要导入 from dj ...

  3. 第三百零八节,Django框架,models.py模块,数据库操作——链表结构,一对多、一对一、多对多

    第三百零八节,Django框架,models.py模块,数据库操作——链表结构,一对多.一对一.多对多 链表操作 链表,就是一张表的外键字段,连接另外一张表的主键字段 一对多 models.Forei ...

  4. 第三百零七节,Django框架,models.py模块,数据库操作——表类容的增删改查

    Django框架,models.py模块,数据库操作——表类容的增删改查 增加数据 create()方法,增加数据 save()方法,写入数据 第一种方式 表类名称(字段=值) 需要save()方法, ...

  5. 第三百零六节,Django框架,models.py模块,数据库操作——创建表、数据类型、索引、admin后台,补充Django目录说明以及全局配置文件配置

    Django框架,models.py模块,数据库操作——创建表.数据类型.索引.admin后台,补充Django目录说明以及全局配置文件配置 数据库配置 django默认支持sqlite,mysql, ...

  6. Django学习(三)---Models(ORM框架)

    1) Django 中Models是与数据库相关的,与数据库相关的代码一般写在 models.py中,Django 支持 sqlite3, MySQL, PostgreSQL等数据库,只需要在sett ...

  7. Django进阶(三)

    ORM 众所周知有很多不同的数据库系统,并且其中的大部分系统都包含Python接口,能够让我们更好的利用它们的功能,而这些系统唯一的缺点就是需要你了解SQL,如果你是一个更愿意操纵Python对象,而 ...

  8. 【Django】--Models 和ORM以及admin配置

    Models 数据库的配置 1    django默认支持sqlite,mysql, oracle,postgresql数据库 <1>sqlite django默认使用sqlite的数据库 ...

  9. 【Python】django模型models的外键关联使用

    Python 2.7.10,django 1.8.6 外键关联:http://www.bubuko.com/infodetail-618303.html 字段属性:http://www.cnblogs ...

随机推荐

  1. Ubuntu16.04配置Tomcat的80端口访问

    [问题描述] 在阿里云 ECS 服务器 Ubuntu16.04 下部署 Java Web 应用时,发现配置的 Tomcat 服务启动后 80 端口无法被监听. [问题原因] 出现该问题的主要原因是:非 ...

  2. Confluence 6 发送 Confluence 通知到其他 Confluence 服务器

    你可以配置 Confluence 服务器向其他的 Confluence 服务器发送消息.在这种情况下,Confluence 服务器将不会显示 workbox. 希望发送消息到其他 Confluence ...

  3. Confluence 6 使用 Velocity 宏

    当编辑自定义 Decorator 模板文件的时候,有一些宏可被用来定义页面中复杂或者多变的内容,例如菜单,链接等.你可以插入这些宏到你的模板中.更多的信息,请参考Working With Decora ...

  4. 关于在CentOS上,绘图丢失部分中文字的问题

    官方的system.drawing.common 第三方的 zkweb.system.drawing,都用的是libgdiplus 只要是自己编译libgdiplus,都会有这个问题, 问题 : 这里 ...

  5. 论文阅读笔记十一:Rethinking Atrous Convolution for Semantic Image Segmentation(DeepLabv3)(CVPR2017)

    论文链接:https://blog.csdn.net/qq_34889607/article/details/8053642 摘要 该文重新窥探空洞卷积的神秘,在语义分割领域,空洞卷积是调整卷积核感受 ...

  6. 用ffmpeg把视频编码格式转为h.264

    command: ffmpeg -i infile.mp4 -an -vcodec libx264 -crf 23 outfile.h264

  7. Python学生信息管理系统的开发

    # 第一题:设计一个全局变量,来保存很多个学生信息:学生(学号, 姓名,年龄):思考要用怎样的结构来保存:# 第二题:在第一题基础上,完成:让用户输入一个新的学生信息(学号,姓名,年龄):你将其保存在 ...

  8. 牛客寒假算法基础训练集中营4 E题 Applese 涂颜色

    链接:https://ac.nowcoder.com/acm/contest/330/E 来源:牛客网 题目描述 精通程序设计的 Applese 叕写了一个游戏. 在这个游戏中,有一个 n 行 m 列 ...

  9. js中匿名函数和回调函数

    匿名函数: 通过这种方式定义的函数:(没有名字的函数) 作用:当它不被赋值给变量单独使用的时候 1.将匿名函数作为参数传递给其他函数 2.定义某个匿名函数来执行某些一次性任务 var f = func ...

  10. epoll(二)

    epoll概念 epoll对文件描述符的操作方式有两种工作模式:LT模式(Level Trigger,水平触发) 和ET模式(Edge Trigger,边缘触发). LT模式:当epoll_wait检 ...