Django入門--模型系統(一)
1.Django的ORM介紹
對象關系映射(英語:(Object Relational Mapping,簡稱ORM,或O/RM,或O/R mapping),是一種程序技術,用於實現面向對象編程語言裏不同類型系統的數據之間的轉換。從效果上說,它其實是創建了一個可在編程語言裏使用的“虛擬對象數據庫”。
對象關系映射就是通過面向對象的方式操縱數據庫,達到不用編寫SQL語句就能實現對數據庫的增刪改查。只需要通過python的面向對象的方式就能夠清楚數據之間的關系。
python是一個編程語言,一個軟件,mysql是數據庫管理系統,也是一個軟件,python安裝pymysql庫後,通過編寫SQL語句對mysql進行增刪改查等操作,這需要對SQL語句非常了解。在數據庫中,數據之間的關系通過表來展現。在編程語言中有一種面向對象的編程方式,對數據關系進行封裝後描述事物之間的關系。
? 1). 模型類必須都寫在app下的models.py文件中
? 2). 模型如果需要映射到數據庫,所在的app必須被安裝.
? 3). 一個數據表對應一個模型類; 表中的字段對應模型中的類屬性; 模型的一個實例對應表中的一條數據**
2.Django連接mysql的配置流程
啟動服務後,會生成一個db.sqlite3文件,該文件為Django數據庫文件,在默認情況下Django配置了文件型的數據庫,python自帶了sqlite驅動。Django支持多種流行數據庫,詳細請看數據庫參考文檔
下面以連接MySql為例
(1).進入虛擬機,安裝pymysql:pip install pymysql
(2).創建數據庫用戶:
? 1).--創建用戶‘willy‘,密碼為‘123456‘
mysql > create user 'willy'@'%' identified by '123456'
? 2).賦予權限
mysql > grand all on *.* to 'willy'@'%'
? 3).權限生效
mysql > flush privileges
(3).在進入新用戶,並創建數據庫"crm":
mysql -A -uwilly -p123456 #進入新用戶 create database crm; #創建數據庫
(4).在主setting.py中找到模板設置DATABASES,並進行配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 數據庫引擎
'NAME': 'crm', # 數據庫名稱
'USER':'willy', # 連接數據庫的用戶名
'PASSWORD':'123456', # 連接數據庫的密碼
'HOST':'127.0.0.1', # mysql服務器的域名和IP地址
'PORT':'3306', # mysql服務器的端口,默認為3306
}
}
‘NAME‘為創建的數據庫名稱、‘USER‘和‘PASSWORD’分別為新建的新用戶和密碼,必須與上面設置的相同。
(5).修改項目目錄下的__init__.py (和settings.py文件在同一個目錄)
import pymysql
pymysql.install_as_MySQLdb()
(6).在主setting.py中找到TIME_ZONE,設置時區:TIME_ZONE = ‘Asia/ShangHai‘
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = True
3.模型創建與激活
連接數據庫後,需要創建並激活模型,基本流程如下
(1).創建模型
定義模型必須寫在app下的model.py文件中,如在student/model.py:創建Student的模型,代表學生
from django.db import models
# Create your models here.
class Student(models.Model):
name = models.CharField(max_length=20) # 字符串,max_length必須給
age = models.SmallIntegerField(default=0) # default默認值
sex = models.SmallIntegerField(default=1)
qq = models.CharField(max_length=20, default='')
phone = models.CharField(max_length=20, default='')
c_time = models.DateTimeField(verbose_name='報名時間',
auto_now_add=True)
def __str__(self):
return '%s-%s' %(self.name, self.age)
總結:
? 1).任何模型都是django.db.models.Model的子類
? 2).類變量(屬性)表示模型中的數據庫字段
? 3).每一個字段由一個字段類的實例表示,如字符字段用CharField表示,日期字段用 DateTimeField表示
(2).激活模型
? 1)註冊APP:
在主settings.py下的INSTALLED_APPS註冊應用‘student‘
? 2)創建遷移(在項目根目錄下):
遷移是Django對模型的更改方式,告訴Django我們做了哪些數據庫更改,會在app/migrations下生成類似"0001_initial.py"的數據庫遷移文件
python manage.py makemigrations student
註:若果不加"student",就會對settings中註冊的所有app都進行遷移
? 3)查看SQL語句
獲取遷移的SQL語句,可以看出Django的模型會自動創建‘id‘主鍵,表名的形式為:應用名_模塊名小寫
python manage.py sqlmigrate student 0001
? 4).應用遷移
創建遷移後,在mysql中還沒用建立表,需要運行migrate命令,將遷移文件中的映射數據提交數據庫
python manage.py migrate student
註:如果要刪除表,可以在django模型中註釋模型類,然後執行應用命令,不能手動在命令行刪除。
3.數據的增刪改查
通過命令進入django shell調試工具,然後進行數據的增刪改查,首先安裝ipython
(djenv) pyvip@VIP:~/DjProjects/crm$ pip install ipython # 安裝ipython
(djenv) pyvip@VIP:~/DjProjects/crm$ python manage.py shell # 進入shell調試工具
In[1]:from student.models import Student # 導入模型,進行操作
接下來進行增刪改查操作
(1).增加操作
如增加s1、s2、s3、s4學生信息
# 方法一:
In [1]: s1 = Student(name="Kitty", age=18, sex=0, qq="468531576")
In [2]: s1.save()
# 方法二:
In [3]: s2 = Student()
In [4]: s2.name = 'Tom'
In [5]: s2.age= 21
In [6]: s2.save()
# 方法三:
In [7]: Student.objects.create(name='Kate', age=20, phone='13647254681')
# 方法四:
In [8]: Student.objects.get_or_create(name='Rose', age=19, sex=0, phone='18647523473')
(2).查詢操作
# 方法一:查詢所有記錄對象,輸出QuerySet對象
In [9]: Student.objects.all()
Out[9]: <QuerySet [<Student: Kitty-18>,<Student: Tom-21>,<Student: Kate-20>,<Student: Rose-19>]>
# 方法二:過濾查詢。輸出QuerySet對象
In [10]: Student.objects.filter(sex=1)
Out[10]: <QuerySet [<Student: Tom-21>,<Student: Kate-20>]>
# 方法三:查詢一個記錄對象,輸出單個對象,如果查詢的對象有多個時會報錯,與id一起用
In [11]: Student.objects.get(id=2)
Out[11]: <QuerySet [<Student: Tom-21>]>
In [12]: s = Student.objects.get(id=2)
In [13]: s .c_time
Out[13]: datetime.datetime(2019, 2, 24, 9, 10, 20, 987070, tzinfo=<UTC>)
從數據庫中查詢出來的結果一般是一個集合,這個集合稱為QuerySet,他是一個可叠代對象,可以通過for循環、正向切片的方式進行取值,可以通過list強行將QuerySet變成列表
(3).更改操作
如把Kate的‘sex‘改成‘0‘,‘Tom‘的年齡改成‘19‘
# 修改1條
In [14]: s = Student.objects.get(name='Kate')
In [15]: s.sex = 0
In [16]: s.save()
In [17]: Student.objects.get(name='Kate').sex
Out[17]: 0
# update()修改多條數據
In [18]: Student.objects.filter(name='Tom').update(age=19)
Out[18]: 1 # 返回修改的條數
In [19]: Student.objects.get(name='Tom').age
Out[19]: 19
(4).刪除操作
如刪除學生‘Rose‘,刪除所有女生
# 修改1條
In [20]: s = Student.objects.get(name='Rose')
In [21]: s.delete()
Out[21]: (1, {'student.Student'}: 1)
# 修改多條
In [22]: s = Student.objects.filter(sex=0).delete
Out[22]: (3, {'student.Student}: 3)
Django入門--模型系統(一)