03-Django-models

# Models 模型
- ORM
  - ObjectRelationMap : 把面向對象思想轉換成關係數據庫思想.操做上把類等價於表格
  - 類對應表格
  - 類中的屬性對應表中的字段
  - 在應用中的models.py文件中定義class
  - 全部須要使用ORM的class都必須是 models.Model 的子類
  - class中的全部屬性對應表格中的字段
  - 字段的類型都必須使用 modles.xxx 不能使用python中的類型
  - 在django種,Models負責跟數據庫交互python

- django連接數據庫
  - 自帶默認數據庫Sqllite3
    - 關係型數據庫
    - 輕量級
  - 建議開發用sqlite3, 部署用mysql之類數據庫

    - 切換數據庫在settings中進行設置

    # django 鏈接 mysql
    DATABASES = [
      'default' = {
      'ENGINE' : 'django.db.backends.mysql',
      'NAME' : '數據庫名',
      'PASSWORD': '數據庫密碼',
      'HOST': '127.0.0.1',
      'PORT': '3306',
      }
    ]
  - 須要在項目文件下的__init__文件中導入pymysql包

  ```
  # 在主項目的__init__文件中mysql

  import pymysql
  pymysql.install_as_MySQLdb()
  ```

# models類的使用
- 定義和數據庫表映射的類
  - 在應用中的models.py文件中定義class
  - 全部須要使用ORM的class都必須是 models.Model 的子類
  - class中的全部屬性對應表格中的字段
  - 字段的類型都必須使用 modles.xxx 不能使用python中的類型
- 字段經常使用參數
  1. max_length : 規定數值的最大長度
  2. blank : 是否容許字段爲空,默認不容許
  3. null : 在DB中控制是否保存爲null, 默認爲false
  4. default : 默認值
  5. unique : 惟一
  6. verbose_name : 假名sql

- 數據庫的遷移
  1. 在命令行中,生成數據遷移的語句(生成sql語句)shell

  ```
  python3 manage.py makemigrations
  ```

  2. 在命令行中,輸入數據遷移的指令數據庫

  ```
  python3 manage.py migrate
  ```django

  ps : 若是遷移中出現沒有變化或者報錯,能夠嘗試強制遷移app

  ```
  # 強制遷移命令
  python3 manage.py makemigrations 應用名
  python3 manage.py migrate 應用名
  ```
  3. 對於默認數據庫, 爲了不出現混亂,若是數據庫中沒有數據,每次遷移前能夠把系統
  自帶的sqlite3數據庫刪除


# 1. 查看數據庫中的數據函數

  ```
  1. 啓動命令行 : python3 manage.py shell
  ps: 注意點: 對orm的操做分爲靜態函數和非靜態函數兩種.靜態是指在內存中只有一分內容存在,調用的時候使用 類名. 的方式.若是修改了那麼全部使用的人都會受影響.
  2. 在命令行中導入對應的映射類
  from 應用.models import 類名
  3. 使用 objects 屬性操做數據庫. objects 是 模型中實際和數據庫進行交互的 Manager 類的實例化對象.
  4. 查詢命令
  - 類名.objects.all() 查詢數據庫表中的全部內容. 返回的結果是一個QuerySet類型,其實是類列表中裝這個一個一個數據對象.
  - 類名.objects.filter(條件)
  ```spa

  ```
  # from 應用名.models import 類名
  from myapp.models import Student命令行

  # 查詢Student表中的全部數據,獲得的是一個QuerySet類型
  Student.objects.all()

  # 若是要取出全部QuerySet類型中的全部數據對象,須要遍歷取出全部的對象,再用對象.屬性來查看值
  s = Student.object.all()
  for each in s:
  print(each.name , each.age , each.address , each.phone)

  # 若是要進行過濾篩選,使用filter()方法
  Student.objects.filter(age=18)

  ```

 

# 2. 添加數據

  ```
  對象 = 類() # 使用類實例化對象
  對象.屬性 = 值 # 給對應的對象的屬性賦值
  對象.save() # 必需要執行保存操做,不然數據沒有進入數據庫
  ```

  python3 manage.py shell 命令行中添加數據

  ```
  # from 應用名.models import 類名

  from myapp.models import Student

  # 實例化對象
  s = Student()

  # 給對象的屬性賦值
  s.name = '張三'
  s.address = '雲南昭通'
  s.phone = '13377886678'
  s.age = 20

  # 保存數據
  s.save()
  ```
- 常見查找方法

1. 通用查找格式: 屬性名 _ _ (用下面的內容) =值

  - gt : 大於
  - gte : 大於等於
  - lt : 小於
  - lte : 小於等於
  - range: 範圍
  - year : 年份
  - isnull : 是否爲空

2. 查找等於指定值的格式: 屬性名 = 值
3. 模糊查找: 屬性名 _ _ (使用下面的內容) = 值

  * exact : 精確等於
  * iexact: 不區分大小寫
  * contains: 包含
  * startwith: 以..開頭
  * endwith: 以…結尾 

# 數據庫表關係

- 多表聯查:利用多個表聯合查找某一項信息或者多項信息
- 1:1 OneToOne
  - 創建關係:在模型任意一邊便可,使用OneToOneField
  - add:
    - 添加沒有關係的一邊,直接實例化保存就能夠

      >>> s = School()
      >>> s.school_id = 2
      >>> s.school_name = "nanjingtulingxueyuan"
      >>> s.save()

    - 添加有關係的一邊,使用create方法,或者使用實例化而後save

    # 方法1
    >>> m = Manager()
    >>> m.manager_id = 10
    >>> m.manager_name = "dana"
    >>> m.my_school = s
    >>> m.save()

    # 方法2
    >>> m = Manager.objects.create(manager_id=20, manager_name="erna", my_school=ss[0])
    - query:
      - 有子表查母表: 由子表的屬性直接提取信息
      - 由母表查子表:使用雙下劃線

      >>> s = School.objects.get(manager__manager_name="dana")
      >>> s
      <School: nanjingtulingxueyuan>

  - change:
    - 單個修改使用save
    - 批量修改使用update
    - 不管對子表仍是對母表的修改
  - delete: 直接使用delete仍是刪除

- 1:N OneToMany
  - 一個表格的一個數據項/對象等,能夠有不少個另外一個表格的數據項
  - 好比:一個學校能夠有不少個老師,但一個老師只能在一個學校裏上班
  - 使用上
    - 使用ForengnKey
    - 在多的那一邊,好比上邊的例子就是在Teacher的表格裏進行定義

  Add:
    - 跟一對一方法相似,經過create和new來添加
    - create: 把屬性都填滿,而後不須要手動保存
    - new: 能夠屬性或者參數爲空,必須用save保存
  Query:
    - 以學校和老師的例子爲準
    - 若是知道老師,查學校 ,則經過增長的關係屬性,直接使用
    - 例如,查找t1老師是哪一個學校的
    - 反查=
    - 有學校,我想查下這個學校全部老師,則系統自動在老師模型名稱的小寫下直接加下劃線set,
      用來表示

- N:N ManyToMany
  - 表示任意一個表的數據能夠擁有對方表格多項數據,反之亦然
  - 好比典型例子就是老師和學生的關係
  - 使用上,在任意一方,使用ManyToMany定義,只須要定義一邊
- Add:
  - 添加老師,則在student.teachers.add()
- Query:
  - 跟一對多相似,使用_set查詢

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息