django中模型的使用
阿新 • • 發佈:2018-12-17
模型的基本概念
模型是您的資料唯一而且準確的資訊來源。它包含您正在儲存的資料的重要欄位和行為。一般來說, 每一個模型都對映一個數據庫表。每個模型都是一個 Python 的類,這些類繼承 django.db.models.Model
模型的具體定義方式
class Person(models.Model):
name = models.CharFiled(max_length=20)
age = models.CharFiled(max_length=5)
上述程式碼中定義了一個Person的模型 其中有兩個欄位一個name一個是age這兩個欄位都是**CharFiled()**型別的也就是字元型別,必須定義好最大長度
模型具體屬性
- AutoField()自增長型別,只有主鍵才可以設定
- CharField()字串型別
- IntergerField() 整形
- FloatField() 浮點形
- DecimalField() 浮點型 , 可以設定顯示的位數
DecimalField(max_digits=4) 設定了總長度為四
DecimalField(decimal_places=2) 設定了小數點後兩位
- BooleanField() 布林型別
- DateField() 日期型別
auto_now=True 每次儲存物件是都會更新當前時間
-TimeField() -DateTimeField() 用法類似
約束
- null 設定null=True可以為空,null=False不能為空
- primary_key 設定True標識為主鍵
- unique 設定True唯一標示
- db_colum 設定欄位名,沒指定屬性名即為欄位名
- db_index 設定為索引
- blank 設定為True,表示可以為空白
一對一 、一對多、 多對多
這些關係都是在從表中來做宣告
- OneToOneField()
如人和身份證就是一對一的關係 本質上還是使用的ForeignKey()只是加上了唯一約束,一般我們把人設定為主表,身份證設定為從表
一對一主從表查詢
#人刪除身份證也刪除 r_person = OneToOneField(Person,on_delete=models.CASECODE) # 通過身份證查詢到人 id = IdCard.objects.last() person = id.r_person # 通過人查到身份證 person = Person.objects.last() # 注意此處要使用從表名的小寫形式來查詢到從表 id = person.idcard
- ForeignKey()
如班級和學生 一個班級有多個學生,一個學生只能對應一個班級,班級是主表,學生是從表
一對多主從表查詢
# 主表查從表
clas = Clas.objects.last()
# student_set 是類名小寫加set的格式
# 獲取到和該班級相關的所有學生資訊
# student_set 和objects是相同的用法,可以加篩選條件等等
stu = clas.student_set.all()
# 從表查主表
stu = Student.objects.last()
clas = stu.r_clas
- ManyToManyField()
如課程和學生,一個學生選擇多門課,一個課程可以被多名學生選擇 會建立第三方表,用來儲存學生和課程的關係,
# 主表獲取從表
course = Course.objects.last()
# 和一對多的主獲取從是一樣的用法
stus = course.student_set.all()
# 從表獲取主表
stu = Student.objects.last()
# 此處的r_course和objects也是相同的用法
courses = stu.r_course.all()
on_delete的屬性
1. models.PROTECT 設定為保護模式如果刪除主表資料,關係到從表會報錯
2. models.CASECODE 這是預設模式,表示連級刪除
3. models.SET_NULL 表示將從表資料置空
4. models.SET_DEFAULT 這個要為該欄位先設定一個預設值然後才能啟用
模型元選項
在模型類裡面定義一個Meta類
class Meta:
# 設定遷移後的表名
db_table="Person"
# 表示該類的是一個抽象類, 一般用在父類中,抽象類遷移不會生成表
# 如果不設定,繼承的類生成的表不會有父類的欄位
abstract=True
# 設定的是在資料庫中的排序方式,按name欄位排序
ordering=["name"]
自定義模型管理器
一般我們在實際的開發中都不會刪除資料,所以我們給表會定義一個欄位isdelete用來判斷這條資料是否是有效isdelete =BooleanField(default=False)這樣就會出現一個問題我們在試圖中使用如 Student.objects.all()會獲取到所有的資訊但是如何能只獲取到isdelete只為False的一部分呢
- objects其實只是一個模型管理器,繼承於models.Manager
- 我們只需要自定義一個模型管理器就可以實現只獲取一部分資料了我們只需要自定義一個模型管理器就可以實現只獲取一部分資料了
- 模型管理類的編寫在models.py檔案中
class Myobjects(models.Manager)
# 我們重寫父類的all方法
def all(self):
# 呼叫父類方法,在父類方法基礎上進行再次過濾
return super().all().filter(isdelete=False)
在模型類中新增上Myobjects類的例項化物件
objects = Myobjects()
之後你在views.py中直接使用 Student.objects.all()得到的就是過濾後的資料也就是isdelete=False的資料