Django基礎四

聚合查詢

級聯更新 級聯刪除

操做外鍵字段管理數據的時候,出版社跟書是一對多關係 外鍵字段在書表中。這個時候若是把出版社刪了 所對應的書也會被自動刪除。這個時候若是把出版社主鍵值改變了 那麼書籍表中對應的出版社主鍵值也會自動修。python

聚合函數

​ 聚合函數必須用在分組以後,沒有分組其實默認總體就是一組git

​ Max, Min, Sum, Avg, Count數據庫

一、關鍵字 aggregate

​ 二、還須要導入模塊django

​ from django.db.models import Max, Min, Sum, Avg, Count後端

​ 只要跟數據庫相關的功能,基本上都在django.db.models裏邊,若是沒有,去django.db裏邊找找看。app

​ 一、篩選出價格最高的書籍函數

res = models.Book.objects.aggregate(mr = Max('price'))
print(res)

​ 二、求書籍總價格atom

res = models.Book.objects.aggregate(sm=Sum('price'))
print(res)

​ 三、求書籍的平均價格code

res = models.Book.objects.aggregate(av=Avg('price'))
price(res)

​ 四、一塊兒使用orm

res = models.Book.objects.aggregate(Max('price'), Min('price'), Sum('price'), Avg('price'))
print(res)

分組查詢: group by

應用場景:統計平均值、計算比例

一、關鍵字 annotate

二、藉助於聚合函數

​ from django.db.models import Max, Min, Sum, Avg, Count

django中models後點什麼,就按照什麼分組

題目中‘每’後是什麼,就按什麼分組(如「統計每一個部門的人數」,則按部門分組)

​ 一、統計每本書的做者個數、書名、做者人數

res = models.Book.objects.annotate(author_num=Count('authors__id')).values('title','author_num')	

print(res)

​ 二、統計出每一個出版社賣得最便宜得書得價格

res = models.Publish.objects.annotate(mi n_price=Min('book__price')).values('name', 'min_price')
print(res)

三、統計不止一個做者的書

先拿書及對應的做者數

再篩選出大於1的

res = models.Book.objects.annotate(author_num=Count('author')).filter(author_num__gt=1).values('title','author_num')
print(res)

四、查詢各個做者出的書的總價格

res = models.Author.objects.annotate(sum_price=Sum('book__price')).values('name','sum_price')
print(res)

F 查詢

F 能獲取表中字段對應的值

先導入F模塊

from django.db.models import F

一、查詢庫存數大於賣出數的書籍

res = models.Book.objects.filter(ku_cun__gt=F('mai_chu'))
print(res)

二、將全部書的價格上漲100塊

models.Book.objects.all().update(price=F('price')+100)

三、給全部書名添加統一後綴。操做字符串須要藉助於Concat

先導入兩個模塊

from django.db.models.functions import Concat
from django.db.models import Value

res = models.Book.objects.update(name=Concat(F('name'),Value('新款')))

Q 查詢

Q 能獲取表中字段對應的值

先導入Q模塊

from django.db.models import Q

一、查詢書名是三國演義 或者庫存數是500的書籍

res = models.Book.objects.filter(title='三國演義',kun_cun=500)  # 用逗號是and關係
res = models.Book.objects.filter(Q(title='三國演義')|Q(ku_cun=500))  # 用|是or關係
print(res)

Q對象的高級用法

q = Q()
q.connector = 'or'
q.children.append('title','三國演義')
q.children.append('ku_cun__gt',500)
res = models.Book.objects.filter(q)
print(res)

Django ORM中經常使用字段和參數

說明:

一、表myapp_person的名稱是自動生成的,若是你要自定義表名,須要在model的Meta類中指定 db_table 參數,強烈建議使用小寫表名,特別是使用MySQL做爲後端數據庫時。

二、id字段是自動添加的,若是你想要指定自定義主鍵,只需在其中一個字段中指定 primary_key=True 便可。若是Django發現你已經明確地設置了Field.primary_key,它將不會添加自動ID列。

三、本示例中的CREATE TABLE SQL使用PostgreSQL語法進行格式化,但值得注意的是,Django會根據配置文件中指定的數據庫後端類型來生成相應的SQL語句。

經常使用字段

Autofield

int自增列,必須填入參數 primary_key=True。當model中若是沒有自增列,則自動會建立一個列名爲id的列。

IntegerField 對應int

整數類型,範圍在 -2147483648 to 2147483647。(通常不用它來存手機號(位數也不夠),直接用字符串存,)

BigIntegerField 對應bigint

CharField 對應varchar

字符類型,必須提供max_length參數, max_length表示字符長度。

DateField

日期字段,日期格式 YYYY-MM-DD,至關於Python中的datetime.date()實例。

DateTimeField

日期時間字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],至關於Python中的datetime.datetime()實例。

​ auto_now:每次修改數據的時候 都會自動將當前修改時間更新上去 實時更新
​ auto_now_add:在建立數據的時候 會將當前時間自動記錄 以後不會更新修改時間,可手動修改

EmaiField

BooleanField 傳值True或False,通常存爲1或0

TextField 用來存大段文本

FileField

專門用來文件路徑 '/etc/data/a.txt'
upload_to = '/etc/data'
給該字段傳值的時候 直接傳文件對象
會自動將文件對象保存到upload_to後面指定的文件路徑中
而後將路徑保存到數據庫

DecimalField

10進制小數,須要傳兩個參數:
max_digits,小數總長度
decimal_places,小數位長度

自定有char字段

class MyCharField(models.Field):
	def __init__(self,max_length,*args,**kwargs):
		self.max_length = max_length
		# 從新調用父類的方法
		super().__init__(max_length=max_length,*args,**kwargs)
            
        def db_type(self, connection):
		return 'char(%s)'%self.max_length

字段合集

AutoField(Field)
        - int自增列,必須填入參數 primary_key=True

    BigAutoField(AutoField)
        - bigint自增列,必須填入參數 primary_key=True

        注:當model中若是沒有自增列,則自動會建立一個列名爲id的列
        from django.db import models

        class UserInfo(models.Model):
            # 自動建立一個列名爲id的且爲自增的整數列
            username = models.CharField(max_length=32)

        class Group(models.Model):
            # 自定義自增列
            nid = models.AutoField(primary_key=True)
            name = models.CharField(max_length=32)

    SmallIntegerField(IntegerField):
        - 小整數 -32768 ~ 32767

    PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
        - 正小整數 0 ~ 32767
    IntegerField(Field)
        - 整數列(有符號的) -2147483648 ~ 2147483647

    PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
        - 正整數 0 ~ 2147483647

    BigIntegerField(IntegerField):
        - 長整型(有符號的) -9223372036854775808 ~ 9223372036854775807

    BooleanField(Field)
        - 布爾值類型

    NullBooleanField(Field):
        - 能夠爲空的布爾值

    CharField(Field)
        - 字符類型
        - 必須提供max_length參數, max_length表示字符長度

    TextField(Field)
        - 文本類型

    EmailField(CharField):
        - 字符串類型,Django Admin以及ModelForm中提供驗證機制

    IPAddressField(Field)
        - 字符串類型,Django Admin以及ModelForm中提供驗證 IPV4 機制

    GenericIPAddressField(Field)
        - 字符串類型,Django Admin以及ModelForm中提供驗證 Ipv4和Ipv6
        - 參數:
            protocol,用於指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
            unpack_ipv4, 若是指定爲True,則輸入::ffff:192.0.2.1時候,可解析爲192.0.2.1,開啓此功能,須要protocol="both"

    URLField(CharField)
        - 字符串類型,Django Admin以及ModelForm中提供驗證 URL

    SlugField(CharField)
        - 字符串類型,Django Admin以及ModelForm中提供驗證支持 字母、數字、下劃線、鏈接符(減號)

    CommaSeparatedIntegerField(CharField)
        - 字符串類型,格式必須爲逗號分割的數字

    UUIDField(Field)
        - 字符串類型,Django Admin以及ModelForm中提供對UUID格式的驗證

    FilePathField(Field)
        - 字符串,Django Admin以及ModelForm中提供讀取文件夾下文件的功能
        - 參數:
                path,                      文件夾路徑
                match=None,                正則匹配
                recursive=False,           遞歸下面的文件夾
                allow_files=True,          容許文件
                allow_folders=False,       容許文件夾

    FileField(Field)
        - 字符串,路徑保存在數據庫,文件上傳到指定目錄
        - 參數:
            upload_to = ""      上傳文件的保存路徑
            storage = None      存儲組件,默認django.core.files.storage.FileSystemStorage

    ImageField(FileField)
        - 字符串,路徑保存在數據庫,文件上傳到指定目錄
        - 參數:
            upload_to = ""      上傳文件的保存路徑
            storage = None      存儲組件,默認django.core.files.storage.FileSystemStorage
            width_field=None,   上傳圖片的高度保存的數據庫字段名(字符串)
            height_field=None   上傳圖片的寬度保存的數據庫字段名(字符串)

    DateTimeField(DateField)
        - 日期+時間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]

    DateField(DateTimeCheckMixin, Field)
        - 日期格式      YYYY-MM-DD

    TimeField(DateTimeCheckMixin, Field)
        - 時間格式      HH:MM[:ss[.uuuuuu]]

    DurationField(Field)
        - 長整數,時間間隔,數據庫中按照bigint存儲,ORM中獲取的值爲datetime.timedelta類型

    FloatField(Field)
        - 浮點型

    DecimalField(Field)
        - 10進制小數
        - 參數:
            max_digits,小數總長度
            decimal_places,小數位長度

    BinaryField(Field)
        - 二進制類型

 字段合集

事物( transaction)

概念:

事務是訪問並可能操做各類數據項的一個數據庫操做序列,這些操做要麼所有執行,要麼所有不執行,是一個不可分割的工做單位。事務由事務開始與事務結束之間執行的所有數據庫操做組成。

事物的四大特性:

原子性 atomicity

原子性是指事物的所有操做在數據庫中是一個不可分割的任務單位,要麼全都完成,要麼全都不執行

一致性 consistency

一致性是指在事物執行前和執行後,數據庫都處於一個一致性狀態。事物操做使數據庫由一個一致性狀態變化爲另外一個一致性狀態。

隔離性 Isolation

隔離性是指事物與事物間相互隔離,互不干擾。若是事物T1與T2都要操做同一數據對象,那麼T2要麼在T1執行以前就結束,要麼在T1執行完畢纔開始。兩者不能同時進行。

持久性 durability

事物的持久性是指,事物對數據庫的做用是永久性的,即便數據庫系統發生故障也不會對這個做用產生任何影響。

數據庫三大範式

第一範式(1NF)

簡單說就是:數據庫表中每一個字段都不可拆分,具備原子性。能拆分的必須拆分到不可拆分爲止。

例如人員信息表中某人填了兩個電話號碼,那麼應該將其分開填入兩個字段,電話1,電話2

第二範式(2NF)

一、每一個字段都不可拆分(知足第一範式要求)

二、表中字段沒有部分依賴

例如信息表:學號, 姓名, 年齡, 課程名稱, 成績, 學分;

這個代表顯表示兩組信息:學生信息, 課程信息,不符合第二範式。

存在問題:數據冗餘,每條記錄都含有相同信息。

解決:分紅學生表和課程表分別存儲便可。

第三範式(3NF)

一、每一個字段都不可拆分(知足第一範式要求)

二、表中字段沒有部分依賴

三、沒有傳遞依賴(例如:部門信息表)

例如信息表:學號, 姓名, 年齡, 所在學院, 學院聯繫電話,

存在傳遞依賴(學號) → (所在學院) → (學院地點, 學院電話)

解決:分紅學生表,學院表便可。

rollback()回滾

當一個事件執行了一部分以後就中斷,未執行的部分不能接着正常執行時,已執行的部分就會被撤銷,數據庫回到執行前的狀態,這個撤回動做就叫作回滾。

Django中如何開啓事務:

from django.db import transaction
  
	with transaction.atomic():
		# 在縮進的代碼中書寫數據庫操做
		# 該縮進內的全部代碼 都是一個事務
		pass
相關文章
相關標籤/搜索