ORM是「對象-關係-映射」的簡稱。(Object Relational Mapping,簡稱ORM)python
要想將模型轉爲mysql數據庫中的表,須要在setting裏面寫上這個,把原來帶的替換掉mysql
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'book', # 要鏈接的數據庫名,鏈接前須要建立好 'USER': 'root', # 鏈接數據庫的用戶名 'PASSWORD': '666', # 鏈接數據庫的密碼 'HOST': '127.0.0.1', # 鏈接主機,默認本機 'PORT': 3306 # 端口 默認3306 } }
還需在項目名下的__init__的文件中寫 : 寫成這個的目的是將django默認的驅動MySQLdb 改成 pyMySQL,由於MySQLdb對於py3有很大的問題.git
import pymysql pymysql.install_as_MySQLdb()
經過兩條數據庫遷移命令在指定數據庫建表sql
python manage.py makemigrations #生成記錄,每次修改了models裏面的內容或者添加了新的app,新的app裏面寫了models裏面的內容,都要執行這兩條 python manage.py migrate #執行上面這個語句的記錄來建立表,生成的表名字前面會自帶應用的名字,例如:你的book表在mysql裏面叫作 app01_book 表
而後須要在python裏面查看呢表中內容,須要進行下列操做數據庫
若是想打印ORM轉換過程當中的SQL語句,須要在setting中設置配置:django
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }
在python中ORM三種對應關係app
類----------------->表spa
類對象----------->行(記錄) # 能夠進行增刪改查操做 (.create, .delete(), .update(), .filter(id=1), )code
類屬性----------->表字段 對象
# 增長 # 方法一 book_obj = models.Book(name='吳彥祖', gender='男') # 若是是日期個格式必須寫2018-01-01 這種格式 book_obj.save() # 方法二 models.Book.objects.create(name='吳彥祖',gender='男') # 這裏的Book是models.py文件裏面的類名 # 批量增長 obj_list = [] for i in range(100): obj = models.UserMsg( username= 'daniel%s' %i, password='abc%s' %i ) obj_list.append(obj) models.UserMsg.objects.bulk_create(obj_list)
# 查詢 obj = models.Book.objects.filter(id=1) # 查詢id=1的對象 即便是篩選出來的只有一個,那麼也要在後面加上[索引],由於裝在列表裏. obj = models.Book.objects.all() # 查詢全部的數據 # 上面的obj都是一個相似於用列表裝的對象,要想取出來,能夠使用for循環,或者後面加上[索引], # 而後想要取到對應的字段,直接點字段就能夠, 例如obj[0].name 就是取到該行的name字段的數據.
# 刪除 models.Book.objects.all().delete() # 刪除全部數據 models.Book.objects.filter(id=1).delete() # 刪除id=1的數據
# 改 models.Book.objects.filter(id=1).update(name='劉德華') # 把id=1的姓名改成劉德華
from django.db import models # Create your models here. class Book(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=32) price = models.DecimalField(max_digits=8,decimal_places=2,) pub_date = models.DateTimeField() #必須存這種格式"2012-12-12" publish = models.CharField(max_length=32) def __str__(self): #後添加這個str方法,也不須要從新執行同步數據庫的指令 return self.name #當咱們打印這個類的對象的時候,顯示name值 # 這時候你要打印query set對象的時候就會顯示name名字,看着明白些
Book.objects調用下面這些方法:
# 調用這些方法必須是queryset類型的,也就是說調用完下列方法後結果仍是queryset類型的能夠繼續調用下列的方法 Q <1> all() : # 結果是queryset類型 Q <2> filter(**kwargs): 裏面的關鍵字參數用逗號隔開,表示and的意思# 結果是queryset類型 <3> get(**kwargs): 結果是model對象,至關於queryset對象[索引]以後的,返回的結果有且只有一個 Q <4> exclude(**kwargs): 排除的意思,除了括號裏面的都要, # 結果是queryset類型 Q <5> order_by(*字段): 排序,默認升序,前面加負號(-)就是降序,括號裏面要加引號 # 寫兩個參數就是第一個參數相同的狀況下,按照第二個參數排序. # 結果是queryset類型 Q <6>reverse(): 對查詢結果反向排序,能夠在order_by後面直接寫 # 結果是queryset對象 Q <7>count(): 匹配查詢(queryset)對象, # 結果是queryset類型 <8>first(): 返回第一條記錄 是model對象 <9>last(): 返回最後一條記錄 是model對象 <10>exists(): 若是有數據就返回True,沒有就返回False Q <11>values(*字段): 用的比較多,返回可迭代字典的序列 # 是一個特殊的queryset類型 Q <12>values_list(*字段): 和values很像,返回的是一個元組序列 # 是一個特殊的queryset類型 Q <13> distinct(): 必定要寫在values或者values_list後面進行去重, 例: values('name').distinct()
# 序號前面有Q的都是Queryset類型
values(*字段)的用法
all_books = models.Book.objects.all().values('name','id') print(all_books) #<QuerySet [{'name': '九陽神功', 'id': 1}, {'name': '吸星大法', 'id': 2}]>
values_list(*字段)的用法
all_books = models.Book.objects.all().values_list('id','name') print(all_books) #<QuerySet [(1, '九陽神功'), (2, '吸星大法')]> # 裏面是元組
distinct()的用法
# all_books = models.Book.objects.all().distinct() #這樣寫是表示記錄中全部的字段重複才叫重複. # all_books = models.Book.objects.all().distinct('price') #報錯,不能在distinct裏面加字段名稱 # all_books = models.Book.objects.all().values('price').distinct() 若是values 中有兩個參數,那麼須要這兩個都重複纔去掉
# 打印結果<QuerySet [(Decimal('33.00'),), (Decimal('111.00'),)]>
基於雙下劃線的模糊查詢
Book.objects.filter(price__in=[100,200,300]) #price值等於這三個裏面的任意一個的對象 Book.objects.filter(price__gt=100) #大於,大於等因而price__gte=100,不支持price>100這種參數 Book.objects.filter(price__lt=100) # 小於 Book.objects.filter(price__range=[100,200]) #sql的between and,大於等於100,小於等於200 Book.objects.filter(title__contains="python") #title值中包含python的 Book.objects.filter(title__icontains="python") #不區分大小寫 Book.objects.filter(title__startswith="py") #以什麼開頭,istartswith 不區分大小寫 Book.objects.filter(pub_date__year=2012) # 查找2012年的數據
# 獲得的都是queryset類型 # __month 查找月 __day 查找日 # 若是明明有要找的日期,可是報錯,在setting的配置文件中把 USE_TZ 改成 False,這是因爲mysql數據庫和django的數據庫時區不一樣致使的