08 django模型系統(一)
課前補充:1.虛擬環境的賬號不要用root賬號鏈接虛擬機
1.數據庫的連接配置
django 連接mysql的配置流程:
- 進入虛擬環境,安裝mysql
pymysql pip install pymysql
- 創建數據庫用戶
有創建數據庫權限的用戶
例如:創建一個管理員用戶crm賬號,密碼為crm@python
CREATE USER ‘crm‘@‘%‘IDENTIFIED BY ‘crm@python‘;
給這個用戶授予所有遠程訪問,這個用戶主要用於管理整個數據庫,備份,還原等操作。
GRANT ALL ON *.* TO ‘crm‘@‘%‘;
使授權立即生效:
FLUSH PRIVILEGES;
- 創建數據庫crm
create database crm;
- 修改配置
settings.py(我連接使用的是root用戶,用什麽用戶能連接上就行)
DATABASES = { ‘default‘: { ‘ENGINE‘: ‘django.db.backends.mysql‘, #引擎 ‘NAME‘: ‘crm‘, ‘USER‘: ‘root‘, ‘PASSWORD‘: ‘qwe123‘,‘HOST‘: ‘127.0.0.1‘, ‘PORT‘: ‘3306‘, } }
- 修改項目文件夾(和settings.py文件所在的目錄)下
__init__.py 文件(如果導入不行,先退出pycharm項目,重新進入)
import pymysql pymysql.install_as_MySQLdb()
settings.py設置時區
TIME_ZONE = ‘Asia/Shanghai‘ # 北京時間
2.django的ORM系統
-對象關系映射(Object Relational Mapping,簡稱ORM)!
達到不用編寫SQL語句就能對數據庫進行增刪改查。
3.模型的創建與激活
創建模型
Student的模型,代表學生
from django.db import models # Create your models here. class Student(models.Model): #繼承自Modle 模型會自動創建主鍵 name = models.CharField(max_length=20) #姓名 字符字段(CharField) 必須參數 max_length age = models.SmallIntegerField(default=0) #年齡 SmallInterField default(默認值) sex = models.SmallIntegerField(default=1) #性別 qq = models.CharField(max_length=20,unique=True,null=True) phone = models.CharField(max_length=20,unique=True,null=True) #刪除年級的時候不必把學生都刪除,必須可以設置年級字段為null,on_delete=models.SET_NULL,null=True grade = models.ForeignKey(‘Grade‘,on_delete=models.SET_NULL,null=True) c_time = models.DateTimeField(verbose_name=‘創建時間‘,auto_now_add=True) #時間日期型,verbose_name提示信息,如果有這個參數必須寫在第一個參數位置 e_time = models.DateTimeField(verbose_name=‘編輯時間‘,auto_now=True) #auto_now_add創建對象額時候講當前時間記錄到數據庫 auto_now每次更新都會將時間更新 is_deleted = models.BooleanField(default=False) def __str__(self): #輸出友好,重寫__str__方法,添加這一段對數據庫不造成任何影響,不用做數據庫遷移 return ‘%s-%s-%s‘ %(self.id,self.name,self.age)
總結:
1. 每一個模型都是django.db.models.Model的子類
2. 類變量 表示模型中的數據庫字段
3. 每一個字段由一個字段類的實例表示
激活模型
1.在項目中註冊app,在settings.py
INSTALLED_APPS = [ ‘teacher‘, #添加項目名稱到INSTALLED_APPS中 ‘django.contrib.admin‘, ‘django.contrib.auth‘, ‘django.contrib.contenttypes‘, ‘django.contrib.sessions‘, ‘django.contrib.messages‘, ‘django.contrib.staticfiles‘, ]
2.運行數據庫遷移命令(一定要在項目根目錄下)
python mange.py makemigrations teacher #可以不加teacher,如果不加會把INSTALLED_APPS中所有的app都做更改
告訴django,我們做了哪些數據庫的更改
sqlmigrate 從遷移獲取sql語句,生成的數據庫遷移文件
python manage.py sqlmigrate teacher 000(模糊匹配)
-- Create model Student #(與上面的定義略有不同,只為展示上面命令的結果) -- CREATE TABLE `teacher_student` ( `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(20) NOT NULL, `age` smallint NOT NULL, `sex` smallint NOT NULL, `qq` varchar(20) NOT NULL, `phone` varchar(20) NOT NULL, `c_time` datetime(6) NOT NULL); COMMIT;
# 表名 appname_模型name.lower
3.運行migrate命令,使遷移生效
python manage.py migrate #(執行後,在數據庫裏能夠查到表)
#對於數據庫模型中的修改都要先運行數據庫遷移命令python mange.py makemigrations,並且使遷移生效python manage.py migrate
4.數據的增刪改查
-工具 djang shell 調試工具
需要安裝ipython
pip install ipython
進入調試工具,如下
pyvip@Vip:~$ workon django (django) pyvip@Vip:~$ cd crm/ (django) pyvip@Vip:~/crm$ ls crm db.sqlite3 demo.py manage.py static student teacher templates upload (django) pyvip@Vip:~/crm$ python manage.py shell Python 3.5.2 (default, Nov 23 2017, 16:37:01) Type ‘copyright‘, ‘credits‘ or ‘license‘ for more information IPython 7.3.0 -- An enhanced Interactive Python. Type ‘?‘ for help.
In [1]:
數據增加,查詢
In [1]: from teacher.models import Student #從模型中導入數據庫 In [2]: Student.objects #objects是Student模型類的管理器 Out[2]: <django.db.models.manager.Manager at 0xb47e7c4c> In [3]: Student.objects.all() Out[3]: <QuerySet []> #返回查詢集QuerySet - 增 4種方法 1.實例化一個對象 In [7]: s1 = Student(name = ‘aaa‘,age=19,qq=‘1234‘) In [8]: s.save() #只有調用save()方法後才能保存到數據庫 In [10]: Student.objects.all() Out[10]: <QuerySet [<Student: Student object (1)>]> 2.創建一個空的實例對象,再通過添加對象屬性 In [11]: s2= Student() In [12]: s2.name =‘xinlan‘ In [13]: s2.age = 18 In [14]: s2.qq = ‘12312‘
In [15]: s2.save() #只有調用save()方法後才能保存到數據庫
3.一步創建數據,直接操作數據 In [11]: Student.objects.create(name=‘xiaopo‘,age=16) Out[11]: <Student: xiaopo-16> 4.通過get_or_create方法創建對象(先查,如果沒有再創建)
False代表是查來的,True 是創建來的
In [14]: Student.objects.get_or_create(name=‘xiaopo‘,age=16)
Out[14]: (<Student: xiaopo-16>, False) #返回一個元組,第一個值是一個模型對象
In [15]: s=Student.objects.get_or_create(name=‘shiwei‘,age=16)
In [16]: s
Out [16]:(<Student: shiwei-16>, True)
In [17]:s[0].name
Out [17]:‘shiwei‘
In [18]:s[0].age
Out [18]:‘16‘
- 查詢
In [2]: from teacher.models import Student
#查詢所有
In [3]: Student.objects.all() #返回的查詢集可以for循環,可以叠代,可以切片
Out[3]: <QuerySet [<Student: aaa-19>, <Student: xinlan-18>]>
#查詢一條
#使用get不能查詢出多條,會報錯,最好使用(id)主鍵
In [4]: s = Student.objects.get(id=1) #返回的是對象,不是查詢集
#表裏面的主鍵不一定會取名加id,最好寫成pk,不管主鍵是什麽,都可以查到
In [4]: s = Student.objects.get(pk=1)
In [5]: s
Out[5]: <Student: aaa-19>
#filter過濾
In [23]: res = Student.objects.filter(sex=1)
In [24]: print(res.query) #打印SQL如下
SELECT `teacher_student`.`id`, `teacher_student`.`name`, `teacher_student`.`age`, `teacher_student`.`sex`, `teacher_student`.`qq`, `teacher_student`.`phone`, `teacher_student`.`c_time` FROM `teacher_student` WHERE `teacher_student`.`sex` = 1
In [25]: res
Out[25]: <QuerySet [<Student: aaa-19>, <Student: xinlan-18>, <Student: xiaopo-16>, <Student: shiwei-16>]>
2.
In [18]: res=Student.objects.all()
In [19]: print(res.query)
SELECT `teacher_student`.`id`, `teacher_student`.`name`, `teacher_student`.`age`, `teacher_student`.`sex`, `teacher_student`.`qq`, `teacher_student`.`phone`, `teacher_student`.`c_time` FROM `teacher_student`
可以叠代、切片
In [21]: print(res[1:3].query)
SELECT `teacher_student`.`id`, `teacher_student`.`name`, `teacher_student`.`age`, `teacher_student`.`sex`, `teacher_student`.`qq`, `teacher_student`.`phone`, `teacher_student`.`c_time` FROM `teacher_student` LIMIT 2 OFFSET 1
3.修改,通過對對象數據進行賦值,修改屬性
In [27]: s2 = Student.objects.get(id=4)
In [30]: s2.age
Out[30]: 16
In [31]: s2.age=22
In [32]: s2.save()
In [34]: Student.objects.get(name=‘shiwei‘).age
Out[34]: 22
通過update修改
In [35]: Student.objects.filter(name=‘shiwei‘).update(age=18) #匹配出來的數據全部改成18
Out[35]: 1
In [37]: Student.objects.get(name=‘shiwei‘).age
Out[37]: 18
4.刪除
1.
In [38]: s= Student.objects.get(name=‘shiwei‘)
In [39]: s.delete()
Out[39]: (1, {‘teacher.Student‘: 1})
2.
In [41]: Student.objects.filter(sex=1).delete()
Out[41]: (3, {‘teacher.Student‘: 3})
In [43]: Student.objects.all()
Out[43]: <QuerySet []>
通過在創建數據庫Students模塊
from teacher.models import Student,Grade,StudentDetail,Course,Enroll def index(request): students = Student.objects.all() format_str = ‘%Y-%m-%d %H:%M:%S‘ return render(request,‘teacher/index.html‘,context={ ‘student‘:students, ‘format_str‘:format_str })
08 django模型系統(一)