(模型三)模型成員介紹
阿新 • • 發佈:2019-01-05
類的屬性
- objects:是Manager型別(django中已經定義好的,ORM的核心)的物件,用於與資料庫進行互動
- 當定義模型類時沒有指定管理器,則Django會為模型類提供一個名為objects的管理器
- 支援明確指定模型類的管理器
class BookInfo(models.Model):
...
books = models.Manager() # 自己寫意義不大,一般都用objects,如果自己這樣寫了,預設的objects管理器就沒了
- 當為模型類指定管理器後,django不再為模型類生成名為objects的預設管理器
管理器Manager
- 管理器是Django的模型進行資料庫的查詢操作的介面,Django應用的每個模型都擁有至少一個管理器
- 自定義管理器類主要用於兩種情況
- 情況一:向管理器類中新增額外的方法:見下面“建立物件”中的方式二
- 情況二:修改管理器返回的原始查詢集:重寫get_queryset()方法
class BookInfoManager(models.Manager): def get_queryset(self): return super(BookInfoManager, self).get_queryset().filter(isDelete=False) class BookInfo(models.Model): ... books = BookInfoManager()
建立物件
- 當建立物件時,django不會對資料庫進行讀寫操作
- 呼叫save()方法才與資料庫互動,將物件儲存到資料庫中
- 使用關鍵字引數構造模型物件很麻煩,推薦使用下面的兩種之式
- 說明: _init _方法已經在基類models.Model中使用,在自定義模型中無法使用,
- 方式一:在模型類中增加一個類方法
class BookInfo(models.Model): ... @classmethod def create(cls, title, pub_date): book = cls(btitle=title, bpub_date=pub_date) book.bread=0 book.bcommet=0 book.isDelete = False return book 引入時間包:from datetime import * 呼叫:book=BookInfo.create("hello",datetime(1980,10,11)); 儲存:book.save()
例如:
from django.db import models class BookInfo(models.Model): btitle = models.CharField(max_length=20) bpub_date = models.DateTimeField(db_column='pub_date') # db_column:欄位的名稱,如果未指定,則使用屬性的名稱 bread = models.IntegerField(default=0) # 閱讀量 bcommet = models.IntegerField(null=False) # null=False表示不能為空 isDelete = models.BooleanField(default=False) class Meta: db_table = 'bookinfo' # 預設為booktest_bookinfo @classmethod def create(cls, btitle, bpub_date): b = BookInfo() b.btitle = btitle b.bpub_date = bpub_date b.bread = 0 b.bcommet = 0 b.isDelete = False return b
進入shell
python manage.py shell
檢視資料庫是否改變
- 方式二:在自定義管理器中新增一個方法(推薦用)
- 在管理器的方法中,可以通過self.model來得到它所屬的模型類
class BookInfoManager(models.Manager):
def create_book(self, title, pub_date):
book = self.model()
book.btitle = title
book.bpub_date = pub_date
book.bread=0
book.bcommet=0
book.isDelete = False
return book
class BookInfo(models.Model):
...
books = BookInfoManager()
呼叫:book=BookInfo.books.create_book("abc",datetime(1980,1,1))
儲存:book.save()
例如:
from django.db import models class BookInfoManager(models.Manager): def create(cls, btitle, bpub_date): b = BookInfo() b.btitle = btitle b.bpub_date = bpub_date b.bread = 0 b.bcommet = 0 b.isDelete = False return b class BookInfo(models.Model): btitle = models.CharField(max_length=20) bpub_date = models.DateTimeField(db_column='pub_date') # db_column:欄位的名稱,如果未指定,則使用屬性的名稱 bread = models.IntegerField(default=0) # 閱讀量 bcommet = models.IntegerField(null=False) # null=False表示不能為空 isDelete = models.BooleanField(default=False) class Meta: db_table = 'bookinfo' # 預設為booktest_bookinfo book1 = BookInfoManager() # 作為模型類的屬性用 管理器是模型類中的屬性,用於將物件與資料對映
同樣進入shell
from booktest.models import BookInfo
from datetime import datetime
b = BookInfo.book1.create('a',datetime(2019,1,5)) (book1是管理器)方法1中是:b=BookInfo.create('gt',datetime(2019,1,5))
b.save()
- 在方式二中,可以呼叫self.create()建立並儲存物件,不需要再手動save()
class BookInfoManager(models.Manager):
def create_book(self, title, pub_date):
book = self.create(btitle = title,bpub_date = pub_date,bread=0,bcommet=0,isDelete = False)
return book
class BookInfo(models.Model):
...
books = BookInfoManager()
呼叫:book=Book.books.create_book("abc",datetime(1980,1,1))
檢視:book.pk
例項的屬性
- DoesNotExist:在進行單個查詢時,模型的物件不存在時會引發此異常,結合try/except使用
例項的方法
- str (self):重寫object方法,此方法在將物件轉換成字串時會被呼叫
- save():將模型物件儲存到資料表中
- delete():將模型物件從資料表中刪除