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中的查詢搜索有三種方式:

  • 傳參數
  • 傳字典
  • 傳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)

參數和字典

filter和一起傳入參數和字典

q1 = Q()
q1.connector = 'OR'
q1.children.append(('id', 1))

dic = {'id':123,'name':'alex'}

models.UserInfo.objects.filter(q1,**dic)

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() 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章