Django之model F/Q以及多对多操作
2024-09-02 23:29:53
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()
最新文章
- APK瘦身记,如何实现高达53%的压缩效果
- NSString和NSMutableString常用方法+NSArray常用代码 (转)
- React Native 中组件的生命周期
- c++函数重载
- [Android]通过js方法回调部分native报错 Web Console: Uncaught TypeError: Object [object Object] has no method 'xxx'
- elixir 高可用系列(一) Agent
- POJ 1182 食物链(种类并查集)
- DirectX 基础学习系列6 字体
- [SAP ABAP开发技术总结]选择屏幕——PARAMETERS
- JQuery Ajax 的简单使用
- 【BZOJ1010】【HNOI2008】玩具装箱
- SQL Server 发布订阅 发布类型详解
- [java学习笔记]java语言基础概述之标识符&;关键字&;注释&;常量和变量
- [LeetCode] 76. Minimum Window Substring 解题思路
- List<;T>;实体去重分组:
- Duilib使用wke显示echarts
- git 提高下载速度
- Login 和 Logout
- Excel里函数中的万金油,你确定不要点进来看看?
- [leetcode-513-Find Bottom Left Tree Value]
热门文章
- [译]The Python Tutorial#11. Brief Tour of the Standard Library — Part II
- (转)Xcode6中自动布局autolayout和sizeclass的使用
- ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT 的解决办法
- Python中函数参数类型和参数绑定
- Couchbase I
- 设计模式之第14章-命令模式(Java实现)
- 设计模式之第2章-抽象工厂模式(Java实现)
- 如何选择Android自动化框架的几点拙见
- python week09 Mysql 数据库基础知识
- Java学习4之抽象类