模型类

class Book(models.Model):
nid = models.AutoField(primary_key=True)
title = models.CharField(max_length=32, default=None)
create_time = models.DateTimeField()
price = models.DecimalField(decimal_places=2, max_digits=8, default=None)
publish_id = models.ForeignKey(to="Publish", on_delete=models.CASCADE)
authors = models.ManyToManyField(to='Author') def __str__(self):
return str(self.nid) + ':' + self.title class Publish(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
email = models.CharField(max_length=32) class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
email = models.CharField(max_length=32)
ad = models.OneToOneField(to="AuthorDetail", on_delete=models.CASCADE) class AuthorDetail(models.Model):
address = models.CharField(max_length=32)
telephone = models.IntegerField()

批量插入

book_list = []
for i in range(100):
book = Book(title='book_%s' % i, price=i * i)
book_list.append(book)
Book.objects.bulk_create(book_list)

一对多和多对多 添加操作

# 一对多添加用户

publish = Publish.objects.get(nid=1)

Book.objects.create(

title='ubuntu',

price=122,

create_time='2012-2-2',

publish_id=publish,

# publish_id_id=publish.nid )

# 多对多添加用户

author01 = Author.objects.get(id="")

author02 = Author.objects.get(id="")

book = Book.objects.get(nid='')

# book.authors.add(author01, author02)

# 多对多第二种

book.authors.add(1, 2)

# 多对多第三种

book.authors.add(*[1, 2])

# 删除关联的作者

book.authors.remove(author01)

# 删除所有关联的作者

book.authors.clear()

# 先删除所有在绑定

book.authors.set(1)

查询操作

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

    # 一对多查询
# 正查
book = Book.objects.get(nid='')
# 取到关联的对象
publish = book.publish_id
print(publish.name) # 反查
publish = Publish.objects.get(nid='')
books = publish.book_set.all() # 多对多查询
book = Book.objects.get(nid='')
authors = book.authors.all() author = Author.objects.get(id='')
book = author.book_set.all() # 一对一
author = Author.objects.get(id='')
ad = author.ad
author_detail = AuthorDetail.objects.get(id='')
author = author_detail.author

# 基于双下划线的跨表查询(基于join实现的)
# KEY:正向查询按字段,反向查询按表明小写

    # linux这本书的出版社名字
# 正向
name = Book.objects.filter(title='linux').values('publish_id__name')
# 反向
name = Publish.objects.filter(book__title='linux').values('name') # 查询第一个出版社对用的所有书
# 正向
book = Publish.objects.filter(nid='').values('book__title')
# 反向
book = Book.objects.filter(publish_id_id='').values('title') # 查询Linux这本书所有作者的手机号
telephone = Book.objects.filter(title='linux').values('authors__ad__telephone')
telephone = Author.objects.filter(book__title='linux').values('ad__telephone') # 查询id=1的出版社的作者的书籍和作者的名字
title_name = Publish.objects.filter(nid='').values('book__authors__name', 'book__title')
title_name = Book.objects.filter(publish_id_id=1).values('title', 'authors__name') # 查询作者手机号的开头为110的书籍和出版社名称
title_name = Author.objects.filter(ad__address__startswith='北京').values('book__title', 'book__publish_id__name')

# 聚合和分组

  from django.db.models import Avg, Max, Sum, Min, Count
avg = Book.objects.all().aggregate(price=Avg('price')) # 单表分组查询
# 查询每个出版社id以及对应大的书籍个数
count = Book.objects.values('publish_id').annotate(count=Count(1)) # values中的值为分类的参数
'''
select Count(1) from Book GROUP by publish_id
'''
# 跨表分组查询
# 查看每一个出版社名称以及对应的书籍个数
count = Book.objects.values('publish_id__name').annotate(count=Count(1))
count = Publish.objects.values('name').annotate(c=Count('book__nid'))
# 查找作者大于一个的书籍对应的作者数
query = Book.objects.annotate(c=Count('authors')).filter(c__gt=1).values('c', 'title')

F与Q

F 比较两列大小

Q 两个关系用 与或非 表示

  # F与Q查询
from django.db.models import F, Q # 查询评论数大于点赞数的书籍名称
title = Book.objects.filter(commit_count__gt=F('poll_count') * 1).values('title')
# 让所有的书籍价格加100
price = Book.objects.update(price=F('price') + 100) # 取出评论大于20或者点赞数小于10
ret = Book.objects.filter(Q(commit_count__gt=20) | ~Q(poll_count__gt=10)) # 取价格在等于20或者评论数大于20且点赞数小于10的
ret = Book.objects.filter(Q(Q(price=20) | Q(commit_count__gt=20)) & ~Q(poll_count__gt=10))
ret = Book.objects.filter(Q(Q(price=20) | Q(commit_count__gt=20)), ~Q(poll_count__gt=10))

Q的添加操作

q = Q()
#添加的元素关系为或
q.connertor ="or"
#添加查询条件
q.children.append(("name",""))
q.children.append("age","")

Django ORM 一对一,一对多,多对多, 添加,批量插入和查询的更多相关文章

  1. JPA级联(一对一 一对多 多对多)注解【实际项目中摘取的】并非自己实际应用

    下面把项目中的用户类中有个:一对一  一对多  多对多的注解对应关系列取出来用于学习      说明:项目运行正常 问题类:一对多.一对一.多对多 ============一对多 一方的设置 @One ...

  2. Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作

    Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: ​ ​ ​  ​ ​ 由于如果只使用一张表存储所有的数据,就会操作数 ...

  3. 数据库开发-Django ORM的一对多查询

    数据库开发-Django ORM的一对多查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.联合主键问题 CREATE TABLE `employees` ( `emp_no` ...

  4. mybatis 一对一 一对多 多对多

    一对一 一对多 多对多

  5. day 69-70 一对一 一对多 多对一联表查询

    day 69 orm操作之表关系,多对多,多对一 多对一/一对多, 多对多{类中的定义方法} day69 1. 昨日内容回顾 1. 单表增删改查 2. 单表查询API 返回QuerySet对象的: 1 ...

  6. 使用NHibernate(7)-- 一对一 && 一对多 && 多对多

    1, 一对一. 对于数据量比较大的时候,考虑查询的性能,肯能会把一个对象的属性分到两个表中存放:比如用户和用户资料,经常使用的一般是Id和用户名,用户资料(学校,籍贯等)是不经常被查询的,所以就会分成 ...

  7. JPA 一对一 一对多 多对一 多对多配置

    1 JPA概述 1.1 JPA是什么 JPA (Java Persistence API) Java持久化API.是一套Sun公司 Java官方制定的ORM 方案,是规范,是标准 ,sun公司自己并没 ...

  8. MyBatis的关联关系 一对一 一对多 多对多

    一对一示例 一个妻子对应一个丈夫 数据库表设计时 在妻子表中添加一个丈夫主键的作为外键 1 对应的JavaBean代码虽然在数据库里只有一方配置的外键,但是这个一对一是双向的关系. Husband实体 ...

  9. django与ajax:ajax结合sweetalter ,批量插入数据 ;分页器组件

    目录 一.ajax结合sweetalter 二.bulk_create批量插入数据 三.简易版分页器推导 1. 推导步骤 四.自定义分页器的使用 1. 自定义分页器模板 2. 使用方法 (1)后端代码 ...

随机推荐

  1. Number()、parseInt()、parseFloat()的区别:

    Number().parseInt().parseFloat()的区别: Number()的强制类型转换与parseInt()和parseFloat()方法的处理方式相似,只是它转换的是整个值,而不是 ...

  2. 安全运维之关于个人ip定位与网站监控的分析

    场景:   后台:有人盗刷我的短信接口.小偷偷我手机.无良黑客黑我网站   前台:发个欺骗链接或者说我在网上举报谁谁谁附带一个跳转url获取对方ip.......   How to solve:   ...

  3. T^TOJ - 1251 - 。◕‿◕。TMD - 欧拉函数 - 质因数分解

    http://www.fjutacm.com/Problem.jsp?pid=1251 想了很久,一开始居然还直接枚举因子d,计算重复了. 首先你要找与n的最大公因子大于m的x的个数. \[\sum\ ...

  4. lightoj 1076 【二分找满足条件的最左】

    #include <bits/stdc++.h> using namespace std; typedef long long LL; typedef unsigned long long ...

  5. HDU 1556【线段树区间更新】

    这篇lazy讲的很棒: https://www.douban.com/note/273509745/ if(tree[rt].l == l && r == tree[rt].r) 这里 ...

  6. Unity3D教程:无缝地形场景切换的解决方法

    http://www.unitymanual.com/6718.html 当我们开发一个大型项目的时候-会遇到这样的问题(地形场景的切换)这个只是字面意思-并不是重场景1的100  100 100坐标 ...

  7. 51nod1076(tarjan)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1076 题意:中文题诶- 思路:先用tarjan找出所有桥,再用 ...

  8. cogs 1176. [郑州101中学] 月考

    1176. [郑州101中学] 月考 ★   输入文件:mtest.in   输出文件:mtest.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 在上次的月考中Bug ...

  9. 洛谷P3306 [SDOI2013]随机数生成器(BSGS)

    传送门 感觉我BSGS都白学了……数学渣渣好像没有一道数学题能自己想出来…… 要求$X_{i+1}=aX_i+b\ (mod \ \ p)$ 左右同时加上$\frac{b}{a-1}$,把它变成等比数 ...

  10. Day2课后作业:sed替换程序

    #!/usr/bin/env python #_*_conding:utf-8_*_ import sys,os old_file = sys.argv[1] new_file = sys.argv[ ...