zoukankan      html  css  js  c++  java
  • Django之model F/Q以及多对多操作

    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() 
    
  • 相关阅读:
    元素单侧阴影效果
    有关动画的总结
    吸底效果
    使用seajs来引入js代码
    引用POPUI来实现弹窗效果,且弹窗中的内容可以点击事件
    Js文本溢出自动添加省略号ellipsis
    line-hieght与vertical-align的区别与联系
    实现文本框中输入限制字数的效果
    下拉菜单的实现
    基本SQL命令 (1.SQL命令使用规则/2.库管理/3.表管理/4.表记录管理/5.更改库,库的默认字符集/6.连接数据库的过程/7.数据类型)
  • 原文地址:https://www.cnblogs.com/ccorz/p/5882400.html
Copyright © 2011-2022 走看看