Django框架之第六篇(模型層)--單表操做(增刪改查)、單表查詢和必知必會13條、單表查詢之雙下劃線、Django ORM經常使用字段和字段參數和關係字段

單表操做(增刪改查)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  刪除關聯數據,與之關聯也刪除,級聯刪除

db_constraint   是否在數據庫中建立外鍵約束,默認爲True。

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   一對一

好比做者表和做者詳情表

一般一對一字段用來擴展已有字段。(通俗的說就是一我的的全部信息不是放在一張表裏面的,簡單的信息一張表,隱私的信息另外一張表,之間經過一對一外鍵關聯),隨便建在哪張表上均可以,可是建議建在查詢頻率高的那一組

to   設置要關聯的表。

to_field    設置要關聯的字段。

on_delete    當刪除關聯表中的數據時,當前表與其關聯的行的行爲。(參考上面的例子)

 

(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便可查看查詢語句,具體操做以下:

相關文章
相關標籤/搜索