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