模型類實(shí)例方法
數(shù)據(jù)表的增彤叉、刪赡艰、改操作通過模型類實(shí)例方法完成
- save():將模型對(duì)象保存到數(shù)據(jù)表中,ORM框架會(huì)映射成對(duì)應(yīng)的
insert
或update
語(yǔ)句理张。 - delete():將模型對(duì)象從數(shù)據(jù)表中刪除,ORM框架會(huì)映射成對(duì)應(yīng)的
delete
語(yǔ)句绵患。
實(shí)例演練: 將‘天龍八部’插入到圖書表中
修改urls.py文件雾叭,增加一條路由:url('cure', views.cure),
修改views.py文件,增加cure()
函數(shù)
- 向
app_bookinfo
表中插入記錄
def cure(request):
b = BookInfo() # 創(chuàng)建圖類對(duì)象
b.btitle = '天龍八部' # 添加屬性值a
b.bpub_date = date(1990, 10, 11)
b.save() # 映射成insert語(yǔ)句
return HttpResponse('執(zhí)行結(jié)束')
- 將紅樓夢(mèng)的發(fā)行時(shí)間修改為1987-08-15
def cure(request):
b = BookInfo.objects.get(btitle='紅樓夢(mèng)')
b.bpub_date = '1987-08-15'
b.save() # 映射成update語(yǔ)句
return HttpResponse('執(zhí)行結(jié)束')
- 將郭靖添加到天龍八部中
def cure(request):
p = PersonInfo()
p.pname = '郭靖'
p.pgender = False
p.pcomment = '降龍十八掌'
b2 = BookInfo.objects.get(btitle='天龍八部')
p.hbook = b2 # 外鍵賦值落蝙,指定人物對(duì)象的所屬圖書
p.save()
return HttpResponse('執(zhí)行結(jié)束')
- 刪除人名為公孫勝的記錄
def cure(request):
p = PersonInfo.objects.get(pname='公孫勝')
p.delete()
return HttpResponse('執(zhí)行結(jié)束')
管理器(Manager)
管理器是Django模型進(jìn)行數(shù)據(jù)庫(kù)操作的接口织狐,Django應(yīng)用的每個(gè)模型類都擁有至少一個(gè)管理器
Django通過繼承models.Manager類,來(lái)自定義管理器
自定義管理器類主要用于兩種情況:
- 修改原始查詢集筏勒,重寫
all()
方法- 向管理器類中添加額外的方法移迫,如向數(shù)據(jù)庫(kù)中插入數(shù)據(jù)。
修改原始查詢集管行,重寫all()
方法
實(shí)例演練: 默認(rèn)查詢未刪除的圖書信息
a) 修改models.py
文件厨埋,定義管理器類BookInfoManager
class BookInfoManager(models.Manager):
def all(self):
return super().all().filter(isDelete=False)
b) 在模型類BookInfo
中定義管理器對(duì)象
class BookInfo(models.Model):
bookm = BookInfoManager() # 管理器對(duì)象
...
c) 修改views.py
文件,使用管理器對(duì)象bookm
調(diào)用all()
方法(如果再使用objects
將出錯(cuò))
def index(request):
b = BookInfo.bookm.get(id=1)
...
三國(guó)演義
向管理器類添加額外的方法
對(duì)模型類的數(shù)據(jù)表進(jìn)行操作時(shí)捐顷,推薦將這些操作方法封裝起來(lái)揽咕,放到模型管理器類中
實(shí)例演練: 添加創(chuàng)建圖書類對(duì)象的方法
a)修改models.py
文件中的管理類BookInfoManager
悲酷,增加方法create_book()
,通過參數(shù)傳遞對(duì)象屬性
class BookInfoManager(models.Manager):
def create_book(self, title, pub_date):
book = self.model() # 使用self.model獲得模型類對(duì)象
book.btitle = title
book.bpub_date = pub_date
book.bread = 0
book.bcommet = 0
book.isDelete = False
book.save() # 將數(shù)據(jù)插入進(jìn)數(shù)據(jù)表
return book # 返回創(chuàng)建的對(duì)象
b) 在模型類BookInfo
中定義管理器對(duì)象
class BookInfo(models.Model):
bookm = BookInfoManager() # 管理器對(duì)象
...
c) 修改views.py
文件亲善,使用管理器對(duì)象bookm
調(diào)用create_book()
方法
def index(request):
BookInfo.bookm.create_book("Python", date(2019, 1, 1))
...
模型類的屬性
objects屬性:是models.Manager類型的對(duì)象设易,是用于與數(shù)據(jù)庫(kù)進(jìn)行交互的管理器。
當(dāng)模型類沒有定義管理器時(shí)蛹头,Django會(huì)自動(dòng)生成一個(gè)名為
objects
的管理器
自定義管理器后顿肺,Django不再生成默認(rèn)的objects
管理器
元選項(xiàng)
在模型類中定義類Meta,用于設(shè)置元信息
實(shí)例演練: 自定義數(shù)據(jù)庫(kù)中自動(dòng)生成的數(shù)據(jù)表名
- 數(shù)據(jù)表的默認(rèn)名稱為:
<app_name>_<model_name>
渣蜗,例如:app_bookinfo
- 在模型類
BookInfo
中屠尊,使用元選項(xiàng)db_table
將數(shù)據(jù)表名定義為bookinfo
class BookInfo(models.Model):
...
class Meta: # 定義元選項(xiàng)
db_table='bookinfo' # 指定BookInfo生成的數(shù)據(jù)表名為bookinfo
- end -