操做外鍵字段管理數據的時候,出版社跟書是一對多關係 外鍵字段在書表中。這個時候若是把出版社刪了 所對應的書也會被自動刪除。這個時候若是把出版社主鍵值改變了 那麼書籍表中對應的出版社主鍵值也會自動修。python
聚合函數必須用在分組以後,沒有分組其實默認總體就是一組git
Max, Min, Sum, Avg, Count數據庫
二、還須要導入模塊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)
應用場景:統計平均值、計算比例
二、藉助於聚合函數
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模塊
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模塊
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)
一、表myapp_person的名稱是自動生成的,若是你要自定義表名,須要在model的Meta類中指定 db_table 參數,強烈建議使用小寫表名,特別是使用MySQL做爲後端數據庫時。
二、id字段是自動添加的,若是你想要指定自定義主鍵,只需在其中一個字段中指定 primary_key=True 便可。若是Django發現你已經明確地設置了Field.primary_key,它將不會添加自動ID列。
三、本示例中的CREATE TABLE SQL使用PostgreSQL語法進行格式化,但值得注意的是,Django會根據配置文件中指定的數據庫後端類型來生成相應的SQL語句。
int自增列,必須填入參數 primary_key=True。當model中若是沒有自增列,則自動會建立一個列名爲id的列。
整數類型,範圍在 -2147483648 to 2147483647。(通常不用它來存手機號(位數也不夠),直接用字符串存,)
字符類型,必須提供max_length參數, max_length表示字符長度。
日期字段,日期格式 YYYY-MM-DD,至關於Python中的datetime.date()實例。
日期時間字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],至關於Python中的datetime.datetime()實例。
auto_now:每次修改數據的時候 都會自動將當前修改時間更新上去 實時更新
auto_now_add:在建立數據的時候 會將當前時間自動記錄 以後不會更新修改時間,可手動修改
專門用來文件路徑 '/etc/data/a.txt'
upload_to = '/etc/data'
給該字段傳值的時候 直接傳文件對象
會自動將文件對象保存到upload_to後面指定的文件路徑中
而後將路徑保存到數據庫
10進制小數,須要傳兩個參數:
max_digits,小數總長度
decimal_places,小數位長度
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) - 二進制類型 字段合集
事務是訪問並可能操做各類數據項的一個數據庫操做序列,這些操做要麼所有執行,要麼所有不執行,是一個不可分割的工做單位。事務由事務開始與事務結束之間執行的所有數據庫操做組成。
原子性是指事物的所有操做在數據庫中是一個不可分割的任務單位,要麼全都完成,要麼全都不執行
一致性是指在事物執行前和執行後,數據庫都處於一個一致性狀態。事物操做使數據庫由一個一致性狀態變化爲另外一個一致性狀態。
隔離性是指事物與事物間相互隔離,互不干擾。若是事物T1與T2都要操做同一數據對象,那麼T2要麼在T1執行以前就結束,要麼在T1執行完畢纔開始。兩者不能同時進行。
事物的持久性是指,事物對數據庫的做用是永久性的,即便數據庫系統發生故障也不會對這個做用產生任何影響。
簡單說就是:數據庫表中每一個字段都不可拆分,具備原子性。能拆分的必須拆分到不可拆分爲止。
例如人員信息表中某人填了兩個電話號碼,那麼應該將其分開填入兩個字段,電話1,電話2
一、每一個字段都不可拆分(知足第一範式要求)
二、表中字段沒有部分依賴
例如信息表:學號, 姓名, 年齡, 課程名稱, 成績, 學分;
這個代表顯表示兩組信息:學生信息, 課程信息,不符合第二範式。
存在問題:數據冗餘,每條記錄都含有相同信息。
解決:分紅學生表和課程表分別存儲便可。
一、每一個字段都不可拆分(知足第一範式要求)
二、表中字段沒有部分依賴
三、沒有傳遞依賴(例如:部門信息表)
例如信息表:學號, 姓名, 年齡, 所在學院, 學院聯繫電話,
存在傳遞依賴(學號) → (所在學院) → (學院地點, 學院電話)
解決:分紅學生表,學院表便可。
當一個事件執行了一部分以後就中斷,未執行的部分不能接着正常執行時,已執行的部分就會被撤銷,數據庫回到執行前的狀態,這個撤回動做就叫作回滾。
from django.db import transaction with transaction.atomic(): # 在縮進的代碼中書寫數據庫操做 # 該縮進內的全部代碼 都是一個事務 pass