这篇 感觉很实用--DJANGO ORM
Django之model F/Q以及多对多操作
http://www.cnblogs.com/ccorz/p/5882400.html
model之F/Q操作
F操作,使用查询条件的值
打个比方吧,有一张表,保存着公司员工的工资,公司普涨工资,如何在model中操作,这就用到了F,首先需要导入此模块:
from django.db.models import F
操作:
models.UserInfo.objects.filter().update(salary=F('salary')+500)
Q操作,构造搜索条件
model中的查询搜索有三种方式:
- 传参数
- 传字典
- 传Q对象
传参数
models.UserInfo.objects.filter(id=3,name='alex')
传字典
需要注意的是,传入字典时,字典前面需要加**,标记为字典
dic = {'id':123,'name':'alex'}
models.UserInfo.objects.filter(**dic)
所以我们可以在在捕捉用户输入后,将输入构造成字典,然后将字典当做参数传入查询.
传Q对象,构造搜索条件
首先还是需要导入模块:
from django.db.models import Q
传入条件进行查询:
q1 = Q()
q1.connector = 'OR'
q1.children.append(('id', 1))
q1.children.append(('id', 2))
q1.children.append(('id', 3))
models.Tb1.objects.filter(q1)
合并条件进行查询:
con = Q()
q1 = Q()
q1.connector = 'OR'
q1.children.append(('id', 1))
q1.children.append(('id', 2))
q1.children.append(('id', 3))
q2 = Q()
q2.connector = 'OR'
q2.children.append(('status', '在线'))
con.add(q1, 'AND')
con.add(q2, 'AND')
models.Tb1.objects.filter(con)
model之多对多操作
在数据库表中的对对多,有两种方式:
自定义第三张表
class B2G(models.Model): b_id = models.ForeignKey('Boy') g_id = models.ForeignKey('Girl') class Boy(models.Model): username = models.CharField(max_length=16) class Girl(models.Model): name = models.CharField(max_length=16)使用models中自带的ManytoManyFiled自动创建第三张表
class Boy(models.Model): username = models.CharField(max_length=16) # girl_set def __str__(self): return str(self.id) class Girl(models.Model): name = models.CharField(max_length=16) b = models.ManyToManyField('Boy') def __str__(self): return str(self.id)
我们重点讨论第二中方式,有一点可以确认的是:
- 使用多对多自动创建后,会创建一张第三张表,三张表中会将操作的前两张表中的ID做对应
- 在没有做ManyToMany 对应的那张表中,会有一列
xx_set的数据,其中xx为正向的表名,并且为小写
多对多之查询
#正向查询
#获取一个女孩对象
g1 = models.Girl.objects.get(id=1)
# g1 = models.Girl.objects.filter(id=1)
#获取和当前女孩有关系的所有男孩
g1.b.all() #获取全部
g1.b.filter(name='xxx').count() #获取个数
#反向查询
b1 = models.Boy.objects.get(id=1)
b1.girl_set.all() #获取全部
#连表查询
##正向连表
models.Girl.objects.all().values('id','name','b__username')
##方向连表
models.Boy.objects.all().values('id','name','girl__name')
#注意此处为girl__name,并非girl_set__name.
多对多添加
#正向
g1 = models.Girl.objects.get(id=1)
g1.b.add(models.Boy.objects.get(id=1))
g1.b.add(1) #可以直接添加ID号
bs = models.Boy.objects.all()
g1.b.add(*bs) #可以添加列表
g1.b.add(*[1,2,3]) #可以添加ID的列表
#反向
b1 = models.Boy.objects.get(id=1)
b1.girl_set.add(1)
b1.girl_set.add(models.Girl.objects.all())
#添加和女孩1 与男孩1 2 3 4关联
b1.girl_set.add(*[1,2,3,4])
多对多删除
多对多的删除有两个参数:
- clear() 清空数据
- remove() 删除数据
#正向
g1 = models.Girl.objects.filter(id=1)
#删除第三张表中和女孩1关联的所有关联信息
g1.b.clear() #清空与gilr中id=1 关联的所有数据
g1.b.remove(2) #可以为id
g1.b.remove(*[1,2,3,4]) #可以为列表,前面加*
#反向
b1 = models.Boy.objects.filter(id=1)
b1.girl_set.clear() #清空与boy中id=1 关联的所有数据
...
多对多更新
关键词:update,与单表操作相同.
多对多操作补充说明
其实django中models的操作,也是调用了ORM框架来实现的,pymysql 或者mysqldb,所以我们也可以使用原生的SQL语句来操作数据库:
from django.db import connection
cursor = connection.cursor()
cursor.execute("""SELECT * from tb where name = %s""", ['Lennon'])
row = cursor.fetchone()
这篇 感觉很实用--DJANGO ORM的更多相关文章
- Django 一些少用却很实用的orm查询方法
一.使用Q对象进行限制条件之间 "或" 连接查询 from django.db.models import Q from django.contrib.auth.models im ...
- Python Django中一些少用却很实用的orm查询方法
一.使用Q对象进行限制条件之间 "或" 连接查询 from django.db.models import Q from django.contrib.auth.models im ...
- 【python】-- Django ORM(进阶)
Django ORM(进阶) 上一篇博文简述了Django ORM的单表操作,在本篇博文中主要简述Django ORM的连表操作. 一.一对多:models.ForeignKey() 应用场景:当一张 ...
- python 终级篇 django ---ORM操作
一般操作 必会的 ...
- Django框架之第六篇(模型层)--单表查询和必知必会13条、单表查询之双下划线、Django ORM常用字段和参数、关系字段
单表查询 补充一个知识点:在models.py建表是 create_time = models.DateField() 关键字参数: 1.auto_now:每次操作数据,都会自动刷新当前操作的时间 2 ...
- 建立一个更高级别的查询 API:正确使用Django ORM 的方式(转)
add by zhj: 本文作者是DabApps公司的技术主管,作者认为在view中直接使用Django提供的ORM查询方法是不好的,我对此并不赞同,可能作者 写这篇文章是给Django的初学者看,所 ...
- 单独立使用Django ORM
一.常用的ORM框架简介 在Python下的ORM库不少,同样介绍类似的博文也不少,但是是我非常规的用法,顺便做做笔记.这里参考Python 常用的ORM框架简介文章列出几个, 这个几个我都使用过,但 ...
- django orm总结[转载]
django orm总结[转载] 转载地址: http://www.cnblogs.com/linjiqin/archive/2014/07/01/3817954.html 目录1.1.1 生成查询1 ...
- 如何优雅的写一篇安利文-以Sugar ORM为例
前言 我最近喜欢把写的十分优美的技术文章叫做安利文.首先,文章必须是原创而非软广:其次,阅读之后不仅能快速吸纳技术要点并入门开发,还能感同身受的体会作者热情洋溢的赞美和急于分享心得体验的心情,让人感觉 ...
随机推荐
- tools.jar seem to ....
android stadio 运行不起来,可以在java_home原来的路径下加一个\, 然后就可以运行起来了.
- 这是我见过最厉害的--智能代码生成器、html+js+底层+sql全都有、瓦特平台
1:直接上图.图片有点多.我就没全部上传了. (demo.使用方法.数据库bak)下载:http://pan.baidu.com/s/1ntE5bDn 起源: 之前有好多人问我代码生成器的源码.我发了 ...
- 《Cracking the Coding Interview》——第8章:面向对象设计——题目5
2014-04-23 18:42 题目:设计一个在线阅读系统的数据结构. 解法:这题目太大了,我的个亲娘.显然你不可能一次加载一整本书,做到单页纸加载的粒度是很必要的.为了读书的连贯效果,预取个几页也 ...
- USACO Section1.3 Barn Repair 解题报告
barn1解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...
- python-压缩解压
压缩解压包 #导入模块 import zipfile #新建压缩包并将db与ooo.xml压缩到文件中 z = zipfile.ZipFile('laxi.zip','w') z.write('db' ...
- Ubuntu下禁用笔记本自带键盘
想要禁用笔记本自带键盘(Ubuntu)只要2条命令. 1. 打开终端,输入: xinput list ⎡ Virtual core pointer id=2 [master pointer (3)] ...
- 服务器tomcat配置教程
2018年上学期期末课程设计做了一个留言板,但是我需要把这个Jave Web弄到我的服务器上 首先我们可以安装jdk tomcat在启动时,会读取环境变量的信息,需要一个CATALINA_HOME 与 ...
- C++ 11 智能指针 lamda 以及一个 围棋程序
lamda表达式使用 char* p = "Hello world"; ,nl = ; for_each(p,p+, [&](char i){ if(i=='e') ne+ ...
- hexo 添加标签
--- title: title #文章標題 date: 2016-06-01 23:47:44 #文章生成時間 categories: "Hexo教程" #文章分類目錄 可以省略 ...
- 【bzoj5017】[Snoi2017]炸弹 线段树优化建图+Tarjan+拓扑排序
题目描述 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸时,如果另一个炸弹所在位置 Xj 满足: Xi−Ri≤Xj≤Xi+Ri,那么,该炸弹也会被引爆. 现在 ...