1. 程式人生 > >08 django模型系統(一)

08 django模型系統(一)

目錄 cts ole auto comm eache auth 提示信息 安裝

課前補充: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模型系統(一)