1、ORM(對象關係映射) 不少語言的web框架中都有這個概念
1、 爲何要有ORM?
1. 寫程序離不開數據,要使用數據就須要鏈接數據庫,可是不一樣的數據庫在sql語句上(mysql,oracle等)會有點區別,
所以直接在你的項目中使用sql語句的話,不便於之後的修改,萬一更換了數據庫,那全部sql語句不就要從新寫嗎?
因此這個時候ORM就體現出優勢了,你只須要寫ORM的代碼,它就會根據你鏈接的數據庫自動幫你翻譯成對應的sql語句,
也就是說不管你使用的是mysql仍是oracle,ORM操做數據庫的語句都是同樣的。
2. 不使用ORM時在Python程序中使用數據庫的操做以下:
1. 使用pymysql鏈接MySQL數據庫的步驟
1. import pymysql
2. 創建鏈接
conn = pymysql.connect(
host='127.0.0.1', # 數據庫的ip地址
port=3306, # 數據庫的端口
database='db1', # 要使用哪一個數據庫
user='root', # 用戶名
password='123abc', # 密碼
charset='utf8' # 編碼(記得別寫utf-8)
)
3. 獲取光標對象
cursor = conn.cursor() --> 默認返回((), ())
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) --> 默認返回[{}, {}]
4. 執行sql語句
cursor.execute('select * from userinfo')
cursor.execute('select * from userinfo where username=%s and password=%s', ['ming', '1234'])
5. 獲取結果
1. cursor.fetchone() # 獲取一條
2. cursor.fetchall() # 獲取所有
3. cursor.fetchmany(size) # 獲取size個
2、 ORM(Object Relational Mapping)是什麼?
1. 新的語法,不須要咱們本身寫SQL語句
2. 咱們按照新的語法寫代碼,他幫我翻譯成SQL語句
3、 ORM優缺點
ORM優勢:
1. 開發效率高
2. 容易掌握
3. 容易移植
ORM的缺點:
1. 代碼的執行效率低
4、ORM的映射
python中的類 對應 數據庫中的表
類中的屬性 對應 數據庫中的字段
類的對象 對應 數據庫中的記錄
5、ORM能作哪些事情
1. 操做數據庫中的表
2. 操做數據庫中的記錄
3. 不能操做數據庫,建庫仍是得你本身用sql語句建立
6、Django中使用ORM的步驟
1. 在settings那裏設置databases,告訴Django框架鏈接哪一個數據庫
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 告訴Django要鏈接的是MySQL數據庫
'NAME': 'db1', # 數據庫名稱
'HOST': '127.0.0.1', # 數據庫的IP
'PORT': 3306, # 數據庫的端口
'USER': 'root', # 鏈接數據的帳號
'PASSWORD': '123abc' # 鏈接數據庫的密碼
}
}
2. 告訴Django框架用什麼鏈接數據庫
在和settings.py同目錄下的__init__.py文件中:
import pymysql
pymysql.install_as_MySQLdb()
3. 在app下面的models.py這個文件中定義類
from django.db import models
class 類名(models.Model):
pass
4. 兩個命令修改數據庫中的表(DDL語言)
1. python manage.py makemigrations --> 在app/migrations上記錄models.py的變動
2. python manage.py migrate --> 把變動記錄翻譯成SQL語句,去數據庫執行
7、ORM建立字段的語法
id = models.AutoField(primary_key=True) # 建立自增的id主鍵
password = models.CharField(max_length=20) # varchar(20)
publisher = models.ForeignKey(to='外鍵關聯的類名') # 建立外鍵publisher,會自動關聯另外一種表的主鍵
book = models.ManyToManyField(to='Book') # ORM幫咱們自動建立的第三張表(用於多對多查詢)
age = models.IntegerField() # 建立整型的字段
8、ORM記錄操做語法
1、取記錄
1.all取所有(列表)
data = 類名.objects.all() # 取到類的全部對象,也就是取到數據庫中某個表的全部記錄,返回一個列表,列表每一個元素就是每一條記錄
data[0] # 表明第一個對象,對象對應着表中的第一條記錄
data[0].id # 取第一個對象的id值,也就是取表中的第一條記錄的id字段的值
2.filter篩選(列表)[篩選出全部知足條件的對象組合成一個列表]
filter篩選的結果是一個列表,即ret是列表,ret[0]纔是篩選出來的對象,ret[0].id是這個對象的屬性值,即記錄的字段值
ret = 類名.objects.filter(id=1)
3.get篩選(對象)[get只能獲得一個對象,即便知足條件的不止一個,get也只能拿到第一個知足條件的對象]
get篩選的結果是一個對象,即ret是對象
ret = 類名.objects.get(id=1)
2、新增記錄
# 把數據添加到數據庫中
類名.objects.create(類的屬性(字段)=新的值)
3、刪除記錄
類名.objects.filter(id=1).delete() # 篩選出id=1的對象(記錄),而後在數據庫中把它刪除
類名.objects.get(id=1).delete()
四、修改記錄 1.基於對象的修改
obj = 類名.objects.get(id=1)
obj.name = '新的值' # 此時只是在python中修改了屬性的值
obj.save() # 把改動提交到數據庫
get只能找一個對象,若是找不到或者找到的對象多於一個,會報錯
2.基於QuerySet的update修改
類名.objects.filter(條件).update(字段='新值')
若是filter找到的對象有多個,那麼update就是批量更新這些對象 9、HTML中的特殊符號(模板語言)
1、用傳進來的參數替換msg
{{ msg }}
2、for循環
{% for item in iterable %}
內容
{% endfor %}
例如:
{% for i in list1 %}
<tr>
<td>{{ forloop.counter }}</td> // forloop表明for循環,forloop.counter表明循環到第幾回,至關於序號
<td>{{ i }}</td>
</tr>
{% endfor %}
三、for empty 若是循環的對象內容爲空,則執行empty的語句
{% for item in iterable %}
內容1
{% empty %}
內容2
{% endfor %}
例如:
{% for book in author.book.all %}
book.title
{% empty %}
暫無做品
{% endfor %}
4、if判斷
{% if 條件 %}
內容1
{% else %}
內容2
{% endif %}
10、request
1、request.POST
經過POST方法提交給服務器的數據都會存在request.POST裏面,request.POST是一個相似於字典的類型,
取值方法跟字典同樣,能夠根據鍵去取值,也能夠經過get方法,例如:
request.POST["name"] # 拿到鍵爲name的數據
request.POST.get("name",None) # 拿到鍵爲name的數據,若這個數據不存在,則返回None
request.POST.getlist('name') # 當表單提交的數據是一個列表(多選的checkbox和select的提交),須要使用getlist獲取這個列表
2、request.GET
經過GET方法提交給服務器的數據都會存在request.GET裏面,request.GET是一個相似於字典的類型,
取值方法跟字典同樣,能夠根據鍵去取值,也能夠經過get方法,request.GET是從URL中取參數,例如:
request.GET["id"] # 拿到URL中參數爲id的數據
request.GET.get("id",None) # 拿到URL中參數爲id的數據,若這個參數不存在,則返回None
注意:POST請求的URL中也是能夠帶參數的
3、request.method
request.method就是獲取客戶端提交數據的方式(POST、GET等)
2、 圖書管理系統
1、 表結構
0. 用戶表
1. 出版社
2. 書籍
3. 做者表
4. 做者和書籍的關係表
2、用戶表的建立
# 用戶表
class Userinfo(models.Model):
id = models.AutoField(primary_key=True)
email = models.CharField(max_length=20)
password = models.CharField(max_length=20)
3、 出版社的增刪改查
# 出版社表
class Publisher(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=20)
1. 查
1. ORM: Publisher.objects.all() --> 查詢全部的出版社數據
2. HTML中寫for循環(模板語言)
{% for i in [..., ...] %}
{% endfor %}
2. 增
1. ORM建立數據
Publisher.objects.create(name='新出版社名稱')
3. 刪
1. HTTP中URL添加參數
/delete_publisher/?id=1
2. 如何在Django中獲取URL中的參數
request.GET --> 一個大字典
request.GET.get('id') --> 取值
3. ORM中刪除操做
Publisher.objects.filter(id=1).delete()
4. 改
1. ORM修改
obj.name = '新出版社名稱'
obj.save() --> 把改動提交到數據庫
4、 書籍的增刪改查
# 書籍表
class Book(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=20)
publisher = models.ForeignKey(to='Publisher')
0. ORM中定義外鍵
models.ForeignKey(to='外鍵關聯的類名')
注意事項:
ORM在數據庫中會給外鍵字段自動加_id
1. 查詢
book_obj.publisher --> 書籍關聯的出版社對象
book_obj.publisher_id --> 書籍關聯的出版社id(數據庫中真正保存的那一列的值)
2. 刪除
Book.objects.filter(id=1).delete()
Book.objects.get(id=1).delete()
3. 添加
1. 添加頁面把全部的出版社數據展現成select標籤
2. 模態框添加,區別於跳轉到新頁面添加!!!
3. 添加(注意參數!!!)
1. Book.objects.create(title=new_title, publisher=Publisher.objects.get(id=publisher_id)) # publisher是ORM幫咱們建立的指向外鍵關聯的表的對象
2. Book.objects.create(title=new_title, publisher_id=publisher_id) # publisher_id是一個在數據庫中具體存放的值
4. 編輯
1. 模板語言 if 判斷
{% if publisher == book.publisher %}
<option selected value="{{ publisher.id }}">{{ publisher.name }}</option>
{% else %}
<option value="{{ publisher.id }}">{{ publisher.name }}</option>
{% endif %}
2. 注意.save()
5、做者表的增刪改查
# 做者表(兩張表要實現多對多的關係,須要藉助第三張表才能實現)
class Author(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=16) # 做者名稱
age = models.IntegerField() # 年齡
book = models.ManyToManyField(to='Book') # ORM幫咱們自動建立的第三張表(用於多對多查詢)
注意:book = models.ManyToManyField(to='Book')至關於建立了下面的第三張表,用來關聯做者和書籍多對多的關係 class Author_Book(models.Model):
id = models.AutoField(primary_key=True)
author = models.ForeignKey(to='Author')
book = models.ForeignKey(to='Book')
1. ORM多對多語法
1. book = models.ManyToManyField(to='Book')
2. 優點
1. 幫咱們建立第三張關係表
2. 提供了不少方便的管理方法
1. author_obj.book.all() --> 查詢做者關聯的全部書籍
2. author_obj.book.add(id1,id2) --> 給做者添加關聯書籍信息
3. author_obj.book.set([id1, di2,...]) --> 給做者設置關聯書籍信息
2. 做者表的增刪改查
1. 查
1. author_obj.book.all() # ORM會自動幫咱們實現連表查詢,找出做者對應的全部信息
2. 在Django的模板語言(HTML)中,方法不須要加括號
2. 增
1. author_obj.book.add(*[]) # ORM會自動幫咱們實現連表查詢,而後實現第三張表的增長
3. 刪除
1. author_obj.delete() # Django1.x的版本外鍵默認設置了級聯操做,在做者表刪除做者,第三張表也會自動刪除對應的記錄
2. 補充Django2.0以上的版本
外鍵須要手動設置級聯操做 on_delete=models.CASCADE
多對多須要手動設置級聯操做 db_constraint=True
4. 修改
1. author_obj.book.set([]) # ORM會自動幫咱們實現連表查詢,而後實現第三張表的修改
3、Django小結
1、 新建Django項目的步驟
1. 建立項目和建立APP
2. 配置settings.py
1. 檢查Templates文件夾是否配置好
2. 配置靜態文件相關
1. STATIC_URL = '/static/' --> 默認配好的
2. STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'), --> 本身在項目目錄下新建一個存放靜態文件的文件夾:static
]
3. 註釋掉csrf相關的那一行
4. 配置好數據庫的鏈接信息
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
...
}
}
而後去和settings同級的__init__.py下:
import pymysql
pymysql.install_as_MySQLdb()
5. 配置好app的信息
INSTALLED_APPS = [
...
'本身的app' --> 先建立APP再註冊APP
]
2、 Django中知識點
1. request --> 全部跟請求相關的數據都封裝到這個對象
1. request.method --> 請求方法的全大寫(GET/POST/...)
2. request.GET --> 獲取URL中的參數(相似字典),POST請求的URL也能夠帶參數
request.GET['key']
request.GET.get('key', None)
3. request.POST --> 獲取POST請求中攜帶的參數(相似字典)
2. 基礎的三個方法
1. HttpResponse --> 返回字符串
2. render --> 返回頁面
1. render(request, 'xx.html')
2. render(request, 'xx.html', {'key': value})
3. redirect --> 重定向
1. redirect('/publisher/') --> 重定向到當前項目的其餘頁面
2. redirect('https://www.baidu.com') --> 重定向到其餘頁面
4、Django流程圖