1.Django的ORM簡介
注意:數據庫多種多樣,這導致使用不同的數據庫就要使用不用的操作數據庫的命令,如果我們先是使用的Mysql數據庫, 之後因爲某些要求要使用到Redis數據庫,難道我們要將我們整個項目的相關語句全部都改一遍嗎!!!但是至少我知道Django不需要。因爲Django自帶強大的ORM系統!!!
第一部分介紹:ORM簡介!
(1)ORM概念:對象關係映射(Object Relational Mapping,簡稱ORM)
(2)ORM的優勢:不用直接編寫SQL代碼,只需像操作對象一樣從數據庫操作數據。
第二部分介紹:Django模型映射關係!
1. 模型類必須都寫在app下的models.py文件中。
2. 模型如果需要映射到數據庫,所在的app必須註冊.
3. 一個數據表對應一個模型類,表中的字段,對應模型中的類屬性.
2.數據庫的連接配置(使用Mysql爲例)
(1)此處模型所在的app名爲music,在settings.py中對其進行註冊:
(2)在對應的遠程數據庫中創建對應的數據庫:(pycharm中操作)
首先:開啓遠程連接!
然後,使用遠程中的數據庫Mysql,並創建對應的數據庫db_test
(3)在settings.py中配置DATABASES
# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
'default': {
'ENGINE': 'django.db.backends.mysql', # 數據庫引擎
'NAME': 'db_test', # 數據庫名稱
'USER': 'root', # 連接數據庫的用戶名
'PASSWORD': 'qwe123', # 連接數據庫的密碼
'HOST': '127.0.0.1', # mysql服務器的域名和ip地址
'PORT': '3306', # mysql的一個端口號,默認是3306
}
}
(4)在對應的虛擬環境中安裝pymysql!
(5)設置連接器爲pymysql(因爲Django默認使用的數據庫不是Mysql)
在主目錄下的的__init__.py文件添加下面兩句:
import pymysql
pymysql.install_as_MySQLdb()
3.模型的創建與映射
(1)在app下面的models.py中創建django的模型類.
from django.db import models
# Create your models here.
class User(models.Model):
id = models.AutoField(primary_key=True) #主鍵可以省略,Django默認會爲我們加上一個名爲id的主鍵,寫的話就可以改主鍵的名字!
name = models.CharField(max_length=50)
age = models.IntegerField()
(2)將模型類映射到數據庫:
1.首先執行以下命令,要創建映射文件:(命令:makemigrations)
命令後面可以跟app名稱,表示指定對某個app的模型進行映射,沒寫所有的app都執行(第一次的話不指定)
2.執行以下命令,將映射文件中的映射數據提交到數據庫中:(命令:migrate)
3.打開數據庫我們能看到創建的以app名_模型名的數據表,而其他的一些表格是django自動生成的.
注意:如果要刪除表,那麼可以去django模型中註釋掉模型類,然後執行映射的命令,不要手動在命令行裏面去刪除.
注意:如果要新增字段:就要先在模型類中添加對應字段的屬性,並設置一個默認值,然後執行映射命令,將字段成功的映射到數據庫中才算成功!
4.數據的增刪改查
(1)數據的增刪改查----------增加數據
在視圖函數中導入User模型類,然後使用下面的方法添加數據:
from .models import User
def add_user(request):
#方法一
taka = User(name='taka',age=18)
taka.save()
#方法二
xiaopo = User()
xiaopo.name = 'xiaopo'
xiaopo.age = 18
xiaopo.save()
#方法三
aa = User.objects.get_or_create(name='xiaohong',age=18) #插入前會進行查找,如果沒有相同的數據就會添加;如果有就不會
print(aa) #回返回一個元組,第一個數據是添加成功的實例;第二個數據是True或False。(添加成功爲True;反之爲False)
User.objects.get_or_create(name='xiaohong',age=18)#插入前會進行查找,如果沒有相同的數據就會添加;如果有就不會
return HttpResponse("插入數據成功!")
實現效果:
(2)數據的增刪改查----------查找數據
1.首先:在模型中添加一個類屬性__str__,控制查詢的數據顯示的格式!
from django.db import models
# Create your models here.
class User(models.Model):
id = models.AutoField(primary_key=True) #主鍵可以省略,Django默認會爲我們加上!
name = models.CharField(max_length=50)
age = models.IntegerField()
def __str__(self): #此方法的作用在查詢時會顯示!
return 'User<id=%s,name=%s,age=%s>' %(self.id, self.name, self.age)
2.然後進行查詢:
在視圖函數中導入User模型類,實現簡單的查找
from .models import User
def search_user(request):
#查詢所有記錄對象
rs1 = User.objects.all()
print("這是所有記錄對象:",rs1) #通過print可以在後臺看到我們訪問到的數據,並且輸出方式就是模型中的__str__的格式.
#查詢一個記錄對象
rs2 = User.objects.get(id = 1)
print("這是一個記錄對象:",rs2)
#查詢滿足條件的對象
rs3 = User.objects.filter(name='xiaoming')
print("這是滿足條件的對象:",rs3)
return HttpResponse("查詢數據成功!")
**注意:
1.all()和filter()方法返回的是QuerySet對象.
2.get()方式返回的單個對象,如果符合條件的對象有多個,則get報錯!而且如果查詢不到也會報錯!
**
實現效果:
3.拓展:數據的增刪改查--------數據庫相關的接口(QuerySet API)
1.從數據庫中查詢出來的結果一般是一個集合,這個集合叫做 QuerySet.
2.QuerySet是可迭代對象.
3.QuerySet支持切片, 不支持負索引.
4.可以用list強行將QuerySet變成列表.
(3)數據的增刪改查----------刪除數據
在視圖函數中導入User模型類,然後使用下面的方法刪除數據:
from .models import User
def delete_user(request):
#實例和QuerySet都具備刪除方法
User.objects.get(id=1).delete() #get方法得到的是單個對象,所以是刪除一個數據!
User.objects.filter(age=18).delete() #刪除所有age屬性值爲18的數據!
User.objects.all().delete() #刪除所有數據!
s = User.objects.filter(age=18)
s[1].delete() #刪除名字爲18的數據中的指定的一條
return HttpResponse("刪除數據成功!")
(4)數據的增刪改查----------修改數據
在視圖函數中導入User模型類,然後使用下面的方法更新數據:
from .models import User
def update_user(request):
#第一種方法:先查找到數據,然後再進行屬性賦值修改(對於實例的修改)
rs = User.objects.get(name="xiaoming") #修改name屬性值爲xiaoming的name屬性值爲xiaowang(因爲使用了get方法所以僅修改第一條!)
rs.name='xiaowang'
rs.save()
#第二種方法:使用update方法直接修改(對於集合的修改)
User.objects.filter(name='xiaowang').update(name='AAA') #修改所有name屬性值爲xiaowang的name屬性值爲AAA!
User.objects.all().update(age=22) #修改所有數據的age屬性值爲22!
return HttpResponse("修改數據成功!")