Django之model F Q以及多對多操作

2021-08-27 03:44:19 字數 3357 閱讀 8431

打個比方吧,有一張表,儲存著公司員工的工資,公司普漲工資,如何在model中操作,這就用到了f,首先需要匯入此模組:

from django.db.models import f
操作:

models.userinfo.objects.filter().update(salary=f('salary')+500)
model中的查詢搜尋有三種方式:

傳引數傳字典

傳q物件

models.userinfo.objects.filter(id=3,name='alex')
需要注意的是,傳入字典時,字典前面需要加**,標記為字典

dic = 

models.userinfo.objects.filter(**dic)

所以我們可以在在捕捉使用者輸入後,將輸入構造成字典,然後將字典當做引數傳入查詢.

首先還是需要匯入模組:

from django.db.models import q
傳入條件進行查詢:

q1 = q()

q1.connector = 'or'

models.tb1.objects.filter(q1)

合併條件進行查詢:

con = q()

q1 = q()

q1.connector = 'or'

q2 = q()

q2.connector = 'or'

con.add(q1, 'and')

con.add(q2, 'and')

models.tb1.objects.filter(con)

在資料庫表中的對對多,有兩種方式:

自定義第三張表

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)

我們重點討論第二中方式,有一點可以確認的是:

#正向查詢

#獲取乙個女孩物件

g1 = models.girl.objects.get(id=1)

# g1 = models.girl.objects.filter(id=1)

#獲取和當前女孩有關係的所有男孩

g1.b.all() #獲取全部

g1.b.filter(name='***').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])

多對多的刪除有兩個引數:

#正向

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 關聯的所有資料

...

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

Django學習系列之django分頁

from django.core.paginator import paginator objects post.objects.filter status published 從資料庫中取出所有status published狀態的文章p paginator objects,3 例項化pagina...

構之以技術,付之以匠心 讀《構建之法》有感

開發人員容易陷入這樣一種魔怔的狀態 技術為大,編碼為重,其他都是浮雲。但其實縱觀軟體的生命週期,從需求分析到後期維護更新,每一步都有講究。編碼,並不是唯一。這個感受在我拜讀了鄒欣老師的 構建之法 後更為深刻。萬事開頭難,需求分析作為軟體開發的開始,自然也是令人頭疼。說真的在學校做課設時,我十分反感小...

2 django之搭建django工程

1 建立虛擬環境 mkvirtualenv 虛擬環境名稱 p python3 2 安裝框架 pip install django 1.11.11 3 複習虛擬環境和pip的命令 虛擬環境 mkvirtualenv 建立虛擬環境 rmvirtualenv 刪除虛擬環境 workon 進入虛擬環境 檢視...