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中的查询搜索有三种方式:

  1. 传参数
  2. 传字典
  3. 传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之多对多操作

在数据库表中的对对多,有两种方式:

  1. 自定义第三张表

    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)
  2. 使用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的更多相关文章

  1. Django 一些少用却很实用的orm查询方法

    一.使用Q对象进行限制条件之间 "或" 连接查询 from django.db.models import Q from django.contrib.auth.models im ...

  2. Python Django中一些少用却很实用的orm查询方法

    一.使用Q对象进行限制条件之间 "或" 连接查询 from django.db.models import Q from django.contrib.auth.models im ...

  3. 【python】-- Django ORM(进阶)

    Django ORM(进阶) 上一篇博文简述了Django ORM的单表操作,在本篇博文中主要简述Django ORM的连表操作. 一.一对多:models.ForeignKey() 应用场景:当一张 ...

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

                                       一般操作                                                          必会的 ...

  5. Django框架之第六篇(模型层)--单表查询和必知必会13条、单表查询之双下划线、Django ORM常用字段和参数、关系字段

    单表查询 补充一个知识点:在models.py建表是 create_time = models.DateField() 关键字参数: 1.auto_now:每次操作数据,都会自动刷新当前操作的时间 2 ...

  6. 建立一个更高级别的查询 API:正确使用Django ORM 的方式(转)

    add by zhj: 本文作者是DabApps公司的技术主管,作者认为在view中直接使用Django提供的ORM查询方法是不好的,我对此并不赞同,可能作者 写这篇文章是给Django的初学者看,所 ...

  7. 单独立使用Django ORM

    一.常用的ORM框架简介 在Python下的ORM库不少,同样介绍类似的博文也不少,但是是我非常规的用法,顺便做做笔记.这里参考Python 常用的ORM框架简介文章列出几个, 这个几个我都使用过,但 ...

  8. django orm总结[转载]

    django orm总结[转载] 转载地址: http://www.cnblogs.com/linjiqin/archive/2014/07/01/3817954.html 目录1.1.1 生成查询1 ...

  9. 如何优雅的写一篇安利文-以Sugar ORM为例

    前言 我最近喜欢把写的十分优美的技术文章叫做安利文.首先,文章必须是原创而非软广:其次,阅读之后不仅能快速吸纳技术要点并入门开发,还能感同身受的体会作者热情洋溢的赞美和急于分享心得体验的心情,让人感觉 ...

随机推荐

  1. powershell设置SS代理

    $env:HTTPS_PROXY="http://127.0.0.1:1080" $env:HTTP_PROXY="http://127.0.0.1:1080"

  2. ionic3中关于Ionic ui component使用的一些总结

    在我的理解中,IONIC中例如 ion-list ion-item  ion-input 其实就是相于一段自定义的指令 ,相对于angular1.x中的东西, 所以,我们在使用中,要特别去注意butt ...

  3. USACO Section2.3 Zero Sum 解题报告 【icedream61】

    zerosum解题报告----------------------------------------------------------------------------------------- ...

  4. 【APUE】Chapter8 Process Control

    这章的内容比较多.按照小节序号来组织笔记的结构:再结合函数的示例带代码标注出来需要注意的地方. 下面的内容只是个人看书时思考内容的总结,并不能代替看书(毕竟APUE是一本大多数人公认的UNIX圣经). ...

  5. Python 推导式推导序列

    推导式是从一个或多个迭代器快速创建序列的方法.它可以将循环和条件判断结合,从而避免冗长的代码. 一.列表推导式 语法: [表达式 for item in 可迭代对象] [表达式 for item in ...

  6. (整)Unreal渲染模块 框总览

    @author: 黑袍小道 随缘查看     说明 由于搬山的渲染这部分担心自己理解错误,故而搬移官方下,后面整个完成再反过来更新 (这当且仅当做Unreal的帮助文档).     图形编程 模块 渲 ...

  7. GCC 7.3 for Windows

    GCC 6.1x Compilers 下载地址1: Mingw gcc 6.30下载 这个是某微软员工编译的版本 MinGW is a port of GCC to Windows. It is fr ...

  8. htmlagilitypack解析html

    这是个很好的的东西,以前做Html解析都是在用htmlparser,用的虽然顺手,但解析速度较慢,碰巧今天找到了这个,就拿过来试,一切出乎意料,非常爽,推荐给各位使用. 下面是一些简单的使用技巧,希望 ...

  9. myEclipse如何将程序部署到tomcat(附录MyEclipse调试快捷键)

    部署 1.选中你要部署的项目,在工具栏找到 Deploy MyEclipse J2EE Project to Server 2.单击Add,即出现如下界面.选择相应的Server,要和你在配置tomc ...

  10. WCF的坎坷发布之路

    背景       发布WCF服务之后,总会遇到这样活着那样的错误.再加上对IIS中的一些程序应用不太熟悉,所以解决起来比较困难.网上的解决方案特别多,但都只给出了个别一种原因.经过一个下午和一个上午的 ...