單表操做(增刪改查)sql
補充知識點:數據庫
create_time = models.DateField() #表明年月日django
DateField中關鍵性的參數:ide
1.auto_now:每次操做數據,都會自動刷新當前操做的時間spa
2.auto_now_add:在建立數據的時候,會自動將建立的時間記錄下來,後續的修改不影響該字段3d
增code
方式1:create對象
book_obj =models.Book.objects.create(title='三國',price=19.99,create_time='2019-11-11') print(book_obj.title)
方式2:對象點save()方法blog
from datetime import datetime
ctime = datetime.now() book_obj = models.Book(title='水滸傳',price=96.66,create_time=ctime) book_obj.save()
查 (get,filter,all)排序
print(models.Book.objects.all()) #返回Queryset對象
print(models.Book.objects.get(id=1)) #返回具體的對象,當查詢結果有多個值的時候會報錯 print(models.Book.objects.get(pk=1)) """ pk會自動查找到當前數據的主鍵字段 """ print(models.Book.objects.filter(pk=2)) #返回Queryset對象
改
方式1:update
models.Book.objects.filter(pk=1).update(title='三國演義')
方式2:對象.save()
book_obj = models.Book.objects.get(pk=1)
book_obj.price = 666.66 book_obj.save()
刪除
delete()
models.Book.objects.filter(pk=2).delete()
單表查詢之必知必會13條
操做下面的操做以前,咱們實現建立好了數據表,這裏主要演示下面的操做,再也不細講建立準備過程
<1> all(): 查詢全部結果
<2> filter(**kwargs): 它包含了與所給篩選條件相匹配的對象
<3> get(**kwargs): 返回與所給篩選條件相匹配的對象,返回結果有且只有一個,若是符合篩選條件的對象超過一個或者沒有都會拋出錯誤。
<4> exclude(**kwargs): 它包含了與所給篩選條件不匹配的對象
<5> values(*field): 返回一個ValueQuerySet——一個特殊的QuerySet,運行後獲得的並非一系列model的實例化對象,而是一個可迭代的字典序列,獲得的結果是列表套字典
<6> values_list(*field): 它與values()很是類似,它返回的是一個元組序列,values返回的是一個字典序列,獲得的結果是列表套元組
<7> order_by(*field): 對查詢結果排序
<8> reverse(): 對查詢結果反向排序,請注意reverse()一般只能在具備已定義順序的QuerySet上調用(在model類的Meta中指定ordering或調用order_by()方法)。
<9> distinct(): 從返回結果中剔除重複紀錄(若是你查詢跨越多個表,可能在計算QuerySet時獲得重複的結果。此時可使用distinct(),注意只有在PostgreSQL中支持按字段去重。)
必須全部的字段都徹底重複,才能去重
<10> count(): 返回數據庫中匹配查詢(QuerySet)的對象數量。
<11> first(): 返回第一條記錄
<12> last(): 返回最後一條記錄
<13> exists(): 若是QuerySet包含數據,就返回True,不然返回False
單表查詢之神奇的雙下劃線
查詢價格大於200的書籍
models.Book.objects.filter(price__gt=200) #price>200 大於__gt
查詢價格小於200的書籍
models.Book.objects.filter(price__lt=200) 小於__lt
查詢價格大於等於200的書籍
models.Book.objects.filter(price__gte=200) 大於等於__gte
查詢價格小於等於200的書籍
models.Book.objects.filter(price__lte=200) 小於等於__lte
查詢價格要麼是200,要麼是300,要麼是600
models.Book.objects.filter(price__in=[200,300,600]) 在什麼之間選擇一個__in
查詢價格在200到800之間
models.Book.objects.filter(price__range=(200,800)) 在什麼範圍之間__range
查詢書籍名字中包含p的
models.Book.objects.filter(title__contains='p') # 僅僅只能拿小寫p 包含__contains models.Book.objects.filter(title__icontains='p') # 忽略大小寫
查詢書籍是以三開頭,以p結尾
models.Book.objects.filter(title__startswith='三') 開頭
models.Book.objects.filter(title__endswith='p') 結尾
查詢出版日期是2017年的
models.Book.objects.filter(create_time__year='2017')
Django ORM經常使用字段和字段參數和關係字段
1.ORM經常使用字段
AutoField
int自增列,必須填入參數 primary_key=True。當model中若是沒有寫自增列,則自動會建立一個列名爲id的列。(能夠不寫,會自動建立主鍵爲id的字段)
IntegerField
一個整數類型,範圍在 -2147483648 to 2147483647。(通常不用它來存手機號(位數也不夠),直接用字符串存,)
CharField
字符類型,必須提供max_length參數, max_length表示字符長度。
DateField
日期字段,日期格式 YYYY-MM-DD,至關於Python中的datetime.date()實例。
配置auto_now_add=True,建立數據記錄的時候會把當前時間添加到數據庫。修改數據記錄不會更新該字段
配置上auto_now=True,每次更新數據記錄的時候會更新該字段。
DateTimeField
日期時間字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],至關於Python中的datetime.datetime()實例
2.ORM字段參數
null 用於表示某個字段能夠爲空。 null = True 設置字段容許爲空
unique 若是設置爲unique=True 則該字段在此表中必須是惟一的 。
db_index 若是db_index=True 則表明着爲此字段設置索引。
default 爲該字段設置默認值。
3.關係字段
(1)Foreignkey 一對多
好比書籍和出版社的關係
外鍵類型在ORM中用來表示外鍵關聯關係,通常把ForeignKey字段設置在 '一對多'中'多'的一方。
ForeignKey能夠和其餘表作關聯關係同時也能夠和自身作關聯關係。
字段參數
to 設置要關聯的表
to_field 設置要關聯的表的字段
on_delete 當刪除關聯表中的數據時,當前表與其關聯的行的行爲。
models.CASCADE 刪除關聯數據,與之關聯也刪除,級聯刪除
models.DO_NOTHING
刪除關聯數據,引起錯誤IntegrityError
models.PROTECT
刪除關聯數據,引起錯誤ProtectedError
models.SET_NULL
刪除關聯數據,與之關聯的值設置爲null(前提FK字段須要設置爲可空)
models.SET_DEFAULT
刪除關聯數據,與之關聯的值設置爲默認值(前提FK字段須要設置默認值)
models.SET
刪除關聯數據,
a. 與之關聯的值設置爲指定值,設置:models.SET(值)
b. 與之關聯的值設置爲可執行對象的返回值,設置:models.SET(可執行對象)
class MyModel(models.Model): user = models.ForeignKey( to="User", #關聯User表 to_field="id", #關聯User表id字段 on_delete=models.SET(func) )
(2)OneToOneField 一對一
好比做者表和做者詳情表
一般一對一字段用來擴展已有字段。(通俗的說就是一我的的全部信息不是放在一張表裏面的,簡單的信息一張表,隱私的信息另外一張表,之間經過一對一外鍵關聯),隨便建在哪張表上均可以,可是建議建在查詢頻率高的那一組。
(3)ManyToManyField 多對多
好比書籍表和做者表
多對多生成一張新的表,下面設置的字段不會在book表中出現,它僅僅是一個虛擬字段
新生成的表
Django終端打印SQL語句
若是你想知道你對數據庫進行操做時,Django內部究竟是怎麼執行它的sql語句時能夠加下面的配置來查看
在Django項目的settings.py文件中,在空白處複製粘貼以下代碼:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }
配置好以後,再執行任何對數據庫進行操做的語句時,會自動將Django執行的sql語句打印到pycharm終端上
補充:
除了配置外,還能夠經過一點.query便可查看查詢語句,具體操做以下: