Django之model F/Q以及多对多操作

详解Django中关于Model中的各种操作方法。 这篇博客,介绍了关于 Model中的各种操作方法, 不是很全,但是很好用, 水平有限, 请多理解 。 阅读详情

文章转自:https://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() 
通过FlinkCDC将MySQL中变更的数据写入到kafka(DataStream方式) 文章目录前言一、CDC的种类?二、通过FlinkCDC将数据从MySQL导入到Kafka1.核心代码2.工具类3.可能会出现的错误及解决解决: 前言 CDC的Change Data Capture(变更数据捕获)的缩写 FlinkCDC的核心思想是监测并捕获数据库的变动(包括数据或数据表的插入、更新以及删除等),将这些变更按发生的顺序完整记录下来,写入到消息中间件中以供其他服务进行订阅及消费。 一、CDC的种类? CDC 主要分为基于查询和基于 Binlog 两种方式,简述两者的区别: 阅读详情

相关推荐

40-Type-C电路设计

Type-C电路设计

weixin_66510961的博客 9650

Django 中 Models 的 F()和 Q()函数

F() ---- 专门取对象中某列值的操作 F对象允许Django在未实际链接数据的情况下具有对数据库字段的值的引用。 通常情况下我们在更新数据时需要先从数据库里将原数据取出后方在内存里,然后编辑某些属性,最后提交。 all = BookInfo.objects.filter(auth="小明") for b in all: price = b.price b.price = ...

吴先森的博客 6679

Emuelec系统安装全流程:超详细版指南(从零开始)

手把手带你完成emuelec系统的完整安装,从基础准备到系统配置一步不落,适合新手入门。深入解析emuelec在各类设备上的部署技巧,让复古游戏体验更流畅。

weixin_42594419的博客 1970

django modles Q 使用

看看Q是怎么说明的,如果条件查询条件筛选为一个范围,则有and,or,默认为and """ Encapsulates filters as objects that can then be combined logically (using `&` and `|`). """ # Connection types AND = 'AND' OR = 'OR' default = ...

文大帅的博客 504

【STM32Cube HAL】输入捕获(六)——脉宽测量

1

HAHAHA 4907

开源LocalAI本地人工智能安装教程

LocalAI是一款能在本地运行的人工智能应用,它兼容了OpenAI API规范,它可以在普通的电脑运行,不需要GPU,也不需要联网,音频转录

2301_78652552的博客 3613

Django Q对象和查询表达式简介

DjangoQ对象和查询表达式简介

Leon_Jinhai_Sun的博客 585

高动态范围结构光三维测量技术:从多曝光融合到深度学习的演进与应用

本文深入探讨了高动态范围结构光三维测量技术的演进与应用,从传统的多曝光融合技术到深度学习驱动的创新方案。通过工业案例展示了该技术在提升测量精度和效率方面的显著优势,特别是在处理高反光、复杂表面时的突破性表现。文章还提供了针对不同工业场景的技术选型指南,帮助工程师优化三维测量解决方案。

weixin_29063979的博客 293

Django笔记教程:三、Model进阶

Model 进阶学习简介Django经常被用于一些创业团队,乃是因为其非常适合敏捷开发,开发效率非常之高。Model 作为Django重要组成部分也是亮点之一,着实需要我们花时间好好梳理一遍。 ORM还是需要好好学习的,确实可以大大的提升代码的简洁性。Django的model模块,遵循了DRY(don’t repeat yourself)原则,也会使得代码更加容易维护,只需修改一次,肯定

alvine008的专栏 1万+

Protege本体建模实战:从零构建电影知识图谱并导入Neo4j

本体建模是知识图谱构建的基石,通过类、属性、实例和约束系统描述领域知识,为数据提供可复用的语义骨架。OWL作为本体描述语言的标准,配合Protege工具可实现可视化建模,并借助推理机验证逻辑一致性,提升模型可靠性。在工程落地中,本体模型常需导入图数据库如Neo4j,以支持高效的关联查询与业务应用。本文以影视领域为背景,完整演示Protege中定义类层级、创建对象/数据属性、填充实例,以及导出OWL文件并通过Python脚本转换为Neo4j节点与关系的全过程,同时梳理命名空间、匿名节点、编码等易踩坑点,帮助读

weixin_29047545的博客 281

ADAS工作原理解析:如何通过智能技术提升驾驶安全

ADAS通过集成传感器、摄像头、雷达、SoC计算单元以及高效的数据融合技术,提供了一系列主动和被动安全功能,如自动刹车、车道保持、自适应巡航控制等。这些功能共同作用,不仅减少了交通事故的发生,还大幅提升了驾驶员的驾驶体验和安全性。随着技术的进步,ADAS的功能将越来越智能,最终迈向全自动驾驶的未来🚗💨。

weixin_43199439的博客 1149

Django之model fitter和F/Q以及多对多操作

F操作,使用查询条件的值 打个比方吧,有一张表,保存着公司员工的工资,公司普涨工资,如何在model中操作,这就用到了F,首先需要导入此模块: from django.db.models import F 操作: models.UserInfo.objects.filter().update(salary=F('salary')+500) Q操作,构造搜索条件 model中的查询搜索有三种方式...

第一天 419

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

day20 FORM补充(随时更新),F/Q操作,model之多对多,django中间件,缓存,信号

python-day20 1、FROM生成select标签的数据应该来源于数据库。 2、model 操作 F/Q (组合查询) 3、model 多对多操作。 4、中间件 :在请求到达url前先会经过中间件,(比如:中间件进行缓存操作,或者黑名单) 5、缓存,django提供缓存功能 6、信号(钩子,保存数据前先执行那些类或者函数) 7、分页(待上传... ...) ...

258

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

python周报第二十周

0.本周知识点预览 model 联表查询 model F/Q model 多对多 中间件 缓存 信号 分页 1.model 联表查询 增删改查操作: # 增 # # models.Tb1.objects.create(c1='xx', c2='oo') 增加一条数据,可以接受字典类型数据 **kwargs # obj =...

dengzhugen4499的博客 278

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Model的基础操作

1.创建表 https://www.cnblogs.com/xiaonq/p/7978409.html 1.1 Meta源信息 1.2 常用字段 from django.db import models class UserInfo(models.Model): username = models.CharField(max_length= 32 ) password = models.CharField(max_length= 32 ) cls = models.ForeinKey(CLS) c

weixin_47311812的博客 1520

Django model查询之F,Q操作

Django学习第六天 Q对象 当你需要查询名字中包含’张’或者包含’李’的用户,这时你就需要使用Q对象。 # 导入Q对象 from django.db.models import Q from .models import UserInfo user = UserInfo.objects.filter(Q(username__contains='张')|Q(username__contains=...

一颗大白菜的博客 787

Django之Model层的F对象,Q对象以及聚合函数

一.F对象: 作用:用于类属性之间的比较。 使用之前需要先导入: from django.db.models import F 例1:查询图书阅读量大于评论量图书信息。 BookInfo.objects.filter(bread__gt=F('bcomment')) **例2:**查询图书 阅读量大于2倍评论 量图书信息。 BookInfo.objects.filter(bread__gt=F(...

wsy_666的博客 736

django model 之F 与 Q 函数使用

F() ---- 专门取对象中某列值的操作 F对象允许Django在未实际链接数据的情况下具有对数据库字段的值的引用。 通常情况下我们在更新数据时需要先从数据库里将原数据取出后方在内存里,然后编辑某些属性,最后提交。 all = BookInfo.objects.filter(auth="小明") for b in all: price = b.price b.price = pr...

隔壁老猪 568

Django Models 多条件查询 以及Q/F查询

文章目录Models多条件查询方法:1、传参数2、传字典3、传Q对象,构造搜索条件4、Q对象使用实例:F对象Q对象 详情查看此参考链接 Models多条件查询方法: 1、传参数 models.UserInfo.objects.filter(id=3,name='alex') 2、传字典 需要注意的是,传入字典时,字典前面需要加** ,记为字典 dic = {'id':123,'name':'alex'} models.UserInfo.objects.filter(**dic) 所以我们可以在在捕捉

小宝儿的学习之路 3457

Django Model操作

前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 ORM是什么?:(在django中,根据代码中的类自动生成数据库的表也叫–code first) ORM:Object Relational Mapping(关系对象映射) 类名对应------》数据库中的表名 类属性对应-

SKY_PLA的博客 4526

django model 多表操作

一、创建模型   1,一对多关系   一本书只有一个出版社,一个出版社可以出版多本书,从而书与出版社之间就构成一对多关系,书是‘多’的一方,出版社是‘一’的一方,我们在建立模型的时候,把外键写在‘多’的一方,即我们要把外键写在book类。 class Book(models.Model): name=models.CharField(max_length=15) price=models.IntegerField() publish=models.ForeignKey('Pu

mihaoyun.com的专栏 856

Django Model 11.Q查询和F查询

文章目录背景知识Q查询复习多条件Q的与或非F查询F选择原数据Q的批量更新 背景知识 models还是学生、班级 Q查询 复习多条件 可以用逗号,也可以用双过滤器.filter .filter Movie.objects.filter(mname__icontains='H',mid=7497) Movie.objects.filter(mname__icontains='H').filter(mi...

happycop的博客 299

Django model数据库操作——02

文章目录 1,Django中使用MySQL 1.1 先写类:在 app01/models.py中写类 2.2 在Django项目中使用MySQL 2.3 使用django admin 2,创建表 2.1 创建表基本语法 2.2 元信息Meta 2.3 字段 2.4 参数 3,Django一对多表结构操作 3.1 一对多基本增删改查 3.2 一对多更多查询操作 3.3 一对多...

hsw的博客 797

django model

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34353714的博客 114
上一篇: Python:闭包与装饰器
下一篇: Django在Model保存前记录日志
python_nice
博客等级 码龄8年 46粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值