博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
这篇 感觉很实用--DJANGO ORM
阅读量:4988 次
发布时间:2019-06-12

本文共 2999 字,大约阅读时间需要 9 分钟。

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)  #可以为idg1.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 connectioncursor = connection.cursor()cursor.execute("""SELECT * from tb where name = %s""", ['Lennon'])row = cursor.fetchone()

转载于:https://www.cnblogs.com/aguncn/p/6548525.html

你可能感兴趣的文章
关于github
查看>>
七个不可错过的React组件库与开发框架
查看>>
Linux系统学习之Ln(软连接和硬链接)
查看>>
72. Generate Parentheses && Valid Parentheses
查看>>
Cordova开发App使用USB进行真机调试
查看>>
element popover源码
查看>>
10.8
查看>>
多语言切换
查看>>
Heartbeat(注意iptables和selinux的问题)
查看>>
[FZYZOJ 1859] 建桥
查看>>
osgearth+vs2010安装
查看>>
uva227puzzle模拟
查看>>
决定360浏览器以极速模式、兼容模式、IE标准模式打开的代码
查看>>
Java 文件上传与下载、email
查看>>
数据库中函数和存储过程的区别
查看>>
PHP复习第二天-数组
查看>>
bzoj 2741 [FOTILE模拟赛] L
查看>>
8 个必备的PHP功能开发
查看>>
iOS开发之资讯类App常用分类控件的封装与实现(CollectionView+Swift3.0+)
查看>>
在JS中:如何让三个未知数倒序显示,求100~1000以内的水仙花数方法:
查看>>