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. 在DOS中操作MySQL数据库出现中文乱码

    1. 问题:最近使用到MySQL数据库操作,在DOS下使用命令行向mysql中插入/读取中文时出现乱码问题. 2. 原因:由于CMD客户端默认编码为GBK,而本人在安装MySQL时设置编码为UTF-8 ...

  2. (五)STL算法

    .算法 1.算法通过迭代器来操作容器中的数据: 2.算法为模板函数: 二.迭代器与算法 1.根据移动能力,将迭代器分成了五类 2.使用萃取,输出各个容器中,迭代器的类别 3.其中istream, os ...

  3. vivado 下安装modelsim

    安装modelsim 下载链接:http://pan.baidu.com/s/1i4vHDbR 密码:dksy 1.运行modelsim-win64-10.4-se.exe,安装软件: 注意事项:安装 ...

  4. 1005:Number Sequence(hdu,数学规律题)

    Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1 ...

  5. 动态获取后台传过来的值作为select选项

    问题描述:点击左侧菜单项,进入对应的具体页面a.html,页面上方有个select框,点击框后,会浮现选择项. 解决思路:对左侧菜单项添加一个onclick事件,进入后台做具体的查询,将查询到的lis ...

  6. 20165314 2017-2018-2《Java程序设计》课程总结

    20165314 2017-2018-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:我期望的师生关系 预备作业2:C语言基础调查和java学习展望 预备作业3:Linux安 ...

  7. Gson将字符串转map时,int默认为double类型

      gson能够将json字符串转换成map, 但是在转成map时, 会默认将字符串中的int , long型的数字, 转换成double类型 , 数字会多一个小数点 , 如 1 会转成 1.0 Gs ...

  8. How does exercise keep your brain young?

    Exercise may protect the brain from disease and dementia as we age, but the mechanisms behind its be ...

  9. Tomcat使用https

    # 用JDK自带的Keytool生成keystore文件keytool -genkey -alias tomcat -keyalg RSA -keypass Envisi0n -storepass E ...

  10. Haproxy重刷一次

    centos上,yum安装,完全无难度. 只是设置时,要注意一下跳转,和nginx规则差不多. https://blog.csdn.net/qq_28710983/article/details/82 ...