开发者社区> 天飞> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

这篇 感觉很实用--DJANGO ORM

简介: Django之model F/Q以及多对多操作 http://www.cnblogs.com/ccorz/p/5882400.html model之F/Q操作 F操作,使用查询条件的值 打个比方吧,有一张表,保存着公司员工的工资,公司普涨工资,如何在model中操作,这就用到了F,首先需要导入此模块: from django.
+关注继续查看

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
Django框架之ORM
33 0
Django框架之ORM
Django框架之ORM
71 0
基于Django实现 RESTful API 之RestFramework框架3
接下来学习RestFramework框架中的认证、权限、频率组件的使用 一、首先实现用户login登录认证功能 做用户登录认证功能可以通过session、cookie和token三种形式,下面的login认证基于token实现 关键点 -- 首先需要...
1313 0
基于Django实现 RESTful API 之RestFramework框架2
前言:上一篇关于RestFramework框架的文章介绍了APIView、解析器和序列化三个很重要的组件,这三个组件的源码执行流程可以说是RestFramework框架的核心部分,要是你完全吃透了,那先恭喜您了,接下来的组件对您来说就很简单了,顺着之前的源码思路很快就融会贯通了。
1439 0
基于Django实现 RESTful API 之RestFramework框架1
一、首先什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资...
1573 0
有Python基础,刚接触web框架的Django初学者
本文面向:有Python基础,刚接触web框架的Django初学者。 环境:windows7 python3.5.1 pycharm Django 1.10版 pip3 一、Django简介 百度百科:一个开放源代码的Web框架,由Python语言编写...... 重点:一个大而全的框架,啥都替你考虑好了。
3274 0
Python高级进阶(二)Python框架之Django写图书管理系统(LMS)
正式写项目准备前的工作   Django是一个Web框架,我们使用它就是因为它能够把前后端解耦合而且能够与数据库建立ORM,这样,一个Python开发工程师只需要干自己开发的事情就可以了,而在使用之前就我们需要给Django做文件配置和数据库配置   上一章写过的文章,有些朋友反应,对于Web框...
1793 0
Python高级进阶(一)Python框架之Django入门
传说中的Django Django由来   Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的框架模式,即模型M,视图V和控制器C。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。
3106 0
+关注
天飞
一个运维老同志
1510
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载