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)
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章