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. Android 支付宝H5 没有回调

    今天测试反馈问题,说,手机上没有安装支付宝的,调用支付宝支付之后,没有回调.不提示成功也不提示失败. 我自己试了半天也都是没有问题 .后来终于可以试出来了. 发现原来是,清单里面注册的Activity ...

  2. DJango跨域中间键

    Skip to main content   Search PyPISearch Help Donate Log in Register django-cors-middleware 1.3.1 pi ...

  3. iOS Crash 分析 符号化崩溃日志

    参考: http://blog.csdn.net/diyagoanyhacker/article/details/41247367 http://blog.csdn.net/diyagoanyhack ...

  4. Percona-Tookit工具包之pt-duplicate-key-checker

      Preface       I suppose that we have a requirement of checking out how many duplicated indexes on ...

  5. python学习笔记-基础

    1.大小写敏感 2. print (n,f,s1,s2,s3,s4,sep='\n')  -- 换行输出  seq='\n' print ('n=%d'%n,'f=%f'%f,'s1=%s'%s1,' ...

  6. shell文本处理工具总结

    shell文本处理工具总结 为了效率,应该熟练的掌握自动化处理相关的知识和技能,能力就表现在做同样的一件事情,可以做的很好的同时,耗时还很短. 再次总结shell文本处理的相关规则,对提高软件调试效率 ...

  7. 用archlinux作为日常开发机的感受

    机器配置 CPU: Intel Core i5-6200U RAM: 8G Resolution: 1920x1080 我在arch下常用的软件 图形桌面环境 i3wm wifi无线管理 Networ ...

  8. FOJ Problem 1015 土地划分

    Problem 1015 土地划分 Accept: 823    Submit: 1956Time Limit: 1000 mSec    Memory Limit : 32768 KB  Probl ...

  9. android 自定义控件之下拉刷新源码详解

    下拉刷新 是请求网络数据中经常会用的一种功能. 实现步骤如下: 1.新建项目   PullToRefreshDemo,定义下拉显示的头部布局pull_to_refresh_refresh.xml &l ...

  10. 对象内存 (扩展 Data Structure Alignment)

    对于一个class object来说,我们需要多少内存才能表现出来,大致分为3类,这里在前面文章有内存图 (1)非静态数据成员的综合大小,这也符合了c++对象模型的结构 (2)填充字节,就是我们所说的 ...