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() 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM