# 模型成員
## 類的屬性
* objects:是Manager類型的對象,用于數據庫進行交互
* 當定義模型類時沒有指定管理器,則Django會為模型類提供一個名為objects的管理器
* 支持明確指定模型類的管理器
```text
class Grades(models.Model)
grades = models.Manager()
```
* 當為模型類指定管理器后,django不再為模型類生成名為objects的默認管理器
## 管理器Manager
* 管理器是Django的模型進行數據庫的查詢操作的接口,Django應用的每個模型都擁有至少一個管理器
* 自定義管理器類主要用于兩種情況
* 情況一:向管理器類中添加額外的方法
* 情況二:修改管理器返回的原始查詢集:重寫get\_queryset\(\)方法
```text
class studentsManager(models.Manager):
def get_queryset(self):
return super(studentsManager,self).get_queryset().filter(isDelete=False)
class Students(models.Model):
stuObj = studentsManager()
```
## 創建對象
* 當創建對象時,django不會對數據庫進行讀寫操作
* 調用save\(\)方法才與數據庫交互,將對象保存到數據庫中
* 使用關鍵字參數構造對象很麻煩,推薦使用下面的兩種方式
* 說明:\_\__init\_\_\_方法已經在基類models.Model中使用,在自定義模型中無法使用
* 方法一:在模型類中增加一個類方法:
```text
class Students(models.Model):
# 定義一個類方法創建對象
# cls代表了students類
@classmethod
def createStudent(cls,name,age,gender,contend,grade,last,create,isDel=False):
stu = cls(
sname = name,
sage = age,
sgender = gender,
scontend = contend,
sgrade = grade,
lastTime = last,
createTime = create,
isDelete = isDel
)
return stu
調用:book = Students.createStudent(name,age,...)
保存:book.save()
```
* 方法二:在定義管理器中添加一個方法
* 在管理器的方法中,可以通過self.model來得到它所屬的模型類
```text
class studentsManager(models.Manager):
def get_queryset(self):
return super(studentsManager,self).get_queryset().filter(isDelete=False)
def createStudent(self,name,age,gender,contend,grade,last,create,isDel=False):
stu = self.model()
stu.sname = name
stu.sage = age
stu.sgender = gender
stu.scontend = contend
stu.sgrade = grade
stu.lastTime = last
stu.createTime = create
stu.isDelete = isDel
return stu
class Students(models.Model):
....
stuObj = studentsManager()
調用:student = Students.stuObj.createStudent(name,age,...)
保存:student.save()
```
* 在方法二中,可以調用self.create\(\)創建并保存對象,不需要再手動save\(\)
```text
class studentsManager(models.Manager):
def get_queryset(self):
return super(studentsManager,self).get_queryset().filter(isDelete=False)
def createStudent(self,name,age,gender,contend,grade,last,create,isDel=False):
stu = self.create(sname=name,sage=age,sgender=gender,scontend=contend,sgrade=grade,lastTime=last,createTime=create,isDelete=isDel)
return stu
class Students(model.Model):
....
stuObj = StudentsManager()
調用:student = Students.stuObj.createStudents(name,age,...)
查看:student.pk
```
## 實例屬性
* DoesNotExist:在進行單個查詢時,模型的對象不存在時會引發此異常,結合try/except使用
## 實例方法
* str\(self\):重寫object方法,此方法在對象轉換字符串時會被調用
* save\(\):將模型對象保存到數據表中
* delete\(\):將模型對象從數據表中刪除