django中models模塊爲各種數據庫提供了統一的api,可根據不一樣的業務需求配置數據庫。html
models模塊開發流程:python
這裏主要是介紹models模塊,那就不得不提到ORMmysql
ORM : 對象-關係-映射git
django中的增刪改查,在orm中轉換爲create/insert等語句再和各類數據庫進行交互,以後,在數據庫中獲得的數據集等在經過orm轉換爲python中的數據表sql
orm的任務:shell
優勢:
減輕開發人員的工做量,不須要面對因數據庫的變動而修改代碼數據庫
一個模型類在數據庫中對應一張表,在模型類中定義的屬性,對應表中的一個字段django
from django.db import models class Students(models.Model): # 模型類 # 字段 id = models.AutoField(primary_key=True) # 建立一個自增的主鍵字段 name = models.CharField(null=False,max_length=20) # 建立一個varchar(20)類型的name且不能爲空
django 會爲表增長自動給增加的主鍵列,每一個模型只能有一個主鍵列,若使用選項設置某屬性爲主鍵列後,則django不會再生存默認的主鍵列。api
屬性命名限制:1.遵循標識符規則 2.不容許連續的下劃線 |
字段類型:字段的建立session
AutoField | 主鍵類型,一個根據實際id自動增加的integerField,一般不指定,若不指定,一個主鍵字段將自動添加到模型中 |
CharField(max_length = 字符長度) | 字符串類型 |
TextField | 大文本字段,通常超過4000使用,(顯示的是一個文本域) |
IntegerField | 整數類型 |
DecimalField(max_digits=None,decimal_places=None) | 十進制浮點數類型 max_digits:位數總數 |
FloatField | 浮點數類型 |
BooleanField | true/false 字段,默認的表單控制室checkboxInput |
NullBooleanField | null/true/false |
DateField([auto_now=False,auto_now_add=False]) | 日期類型 auto_now:每次保存對象時,自動設置爲當前時間(最後一次修改) |
TimeField | 時間類型,參數和DateField相同 |
DateTimeField | 日期-時間類型,參數和DateField相同 |
FileField | 上傳文件的字段 |
ImageField | 繼承了FileField全部屬性和方法,確保是一個有效的image文件 |
舉個栗子:
from django.db import models class Students(models.Model): # 字段 id = models.AutoField(primary_key=True) # 建立一個自增的主鍵字段 name = models.CharField(null=False,max_length=20) # 建立一個varchar(20)類型的name且不能爲空 age = models.IntegerField() gender = models.BooleanField()
字段選項:對字段進行的約束
null | 設置爲true,存入空值到數據庫,默認爲false,數據庫範疇 |
blank | 設爲true ,該字段容許爲空白,默認爲false,表單驗證範疇 |
db_column | 設置字段的名稱,若字段名未指定,則使用設置的屬性名稱 |
db_index | 設爲true,表會爲此字段建立索引 |
default | 設置爲默認值 |
primary_key | 設置爲true ,則該字段會成爲模型的主鍵 |
unique | 設置爲true ,這個字段在表中必須有惟一值 |
數據表間的關係
ForeignKey | 一對多(經常使用)將字段定義在多的端中 |
ManyToManyField | 多對多,將字段定義在兩端中 |
OneToOneField | 一對一,將字段定義在任意一端中 |
舉個栗子:
sgrade = models.ForeignKey("Grades")
元選項:在模型類中定義Meta類,用於設置元信息(對數據庫中具體數據的操做(表級操做)例:排序)
例:db_table:定義數據表名,若不定義,則數據表名默認爲:項目名小寫_類名小寫
ordering:默認排序字段,獲取列表時使用 ordering['id']:升序 ordering['-id']:降序
舉個栗子:
from django.db import models class Students(models.Model): # 字段 id = models.AutoField(primary_key=True) name = models.CharField(null=False,max_length=20) age = models.IntegerField(null=False) gender = models.BooleanField() class Meta: db_table = "students" # 修改爲功! ordering = ['id']
栗子果:
mysql> use python_mysql Database changed mysql> show tables; +----------------------------+ | Tables_in_python_mysql | +----------------------------+ | auth_group | | auth_group_permissions | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | django_admin_log | | django_content_type | | django_migrations | | django_session | | students | +----------------------------+
模型成員
模型的類屬性:
當模型類沒有指定管理器,django則爲模型建立一個名爲objects的管理器,用於和數據庫進行交互(即django模型與數據庫交互的接口)
自定義模型管理器:
stuObj = models.Manager() # 自定義的模型管理器(貌似沒什麼luan用)
更深刻的就是自定義模型管理器類(Manager()類):
from django.db import models class studentsManager(models.Manager): def get_queryset(self): return super(studentsManager, self).get_queryset().filter(gender=False) # filter() 過濾函數可屢次疊加 class Students(models.Model): stuObj = models.Manager() # 自定義的模型管理器 stuObj1 = studentsManager() id = models.AutoField(primary_key=True) name = models.CharField(null=False,max_length=20) age = models.IntegerField(null=False) gender = models.BooleanField(default=True) class Meta: db_table = "students" ordering = ['id']
可在terminal中驗證:
>>python manage.py shell # 進入python環境
>>>from my_inn.models import Students;
>>>Students.stuObj1.all();
>>>Students.stuObj.all(); # 可做結果對比
模型的建立對象
目的:向數據庫中添加數據,當建立對象時,django不會對數據進行讀寫操做,只有調用save()方法後才與數據庫進行交互
兩種方法:
注:__init__方法在父類models.Model中被使用,因此咱們建立的對象是空對象。
舉個栗子:
from django.db import models class studentsManager(models.Manager): def get_queryset(self): return super(studentsManager, self).get_queryset().filter(gender=False) # filter() 過濾函數可屢次疊加 # 管理器中建立對象 def createStudent1(self, sname, sage, sgender): # stu1 = Students() # 只能建立students類的屬性,如有外鍵就不通用勒 stu1 = self.model() # 類型:'my_inn.models.Students' stu1.name = sname stu1.age = sage stu1.gender = sgender return stu1 class Students(models.Model): stuObj = models.Manager() # 自定義的模型管理器 stuObj1 = studentsManager() # 字段 id = models.AutoField(primary_key=True) name = models.CharField(null=False,max_length=20) age = models.IntegerField(null=False) gender = models.BooleanField(default=True) class Meta: db_table = "students" ordering = ['id'] # 定義一個類方法建立對象 @classmethod def createStudent(cls, sname, sage, sgender): stu = cls(name=sname, age=sage,gender=sgender) return stu
對應的在views.py中的函數操做:
from django.shortcuts import render,redirect,HttpResponse from my_inn import models def addstudent(request): # 類方法建立對象 stu = Students.createStudent('nini',22,0) stu.save() # 更新數據庫 return HttpResponse('...') def addstudent1(request): # 管理器建立對象 stu = Students.stuObj1.createStudent('nili',23,1) stu.save() # 更新數據庫 return HttpResponse('...')