1. 程式人生 > >django模型基礎知識

django模型基礎知識

MVC框架中包括一個重要的部分,就是ORM,它實現了資料模型與資料庫的解耦,即資料模型的設計不需要依賴於特定的資料庫,通過簡單的配置就可以輕鬆更換資料庫

ORM是“物件-關係-對映”的簡稱,主要任務是:
    根據物件的型別生成表結構
    將物件、列表的操作,轉換為sql語句
    將sql查詢到的結果轉換為物件、列表

開發流程

1、在models.py中定義模型類,要求繼承自models.Model
2、把應用加入settings.py檔案的installed_app項
3、生成遷移檔案
4、執行遷移生成表
5、使用模型類進行crud操作

使用資料庫生成模型類

  python manage.py inspectdb > booktest/models.py

欄位型別

 AutoField:一個根據實際ID自動增長的IntegerField,通常不指定
        如果不指定,一個主鍵欄位將自動新增到模型中
    BooleanField:true/false 欄位,此欄位的預設表單控制是CheckboxInput
    NullBooleanField:支援null、true、false三種值
    CharField(max_length=字元長度):字串,預設的表單樣式是 TextInput
    TextField:大文字欄位,一般超過4000使用,預設的表單控制元件是Textarea
    IntegerField:整數
    DecimalField(max_digits=None, decimal_places=None):使用python的Decimal例項表示的十進位制浮點數
    DecimalField.max_digits:位數總數
    DecimalField.decimal_places:小數點後的數字位數
    FloatField:用Python的float例項來表示的浮點數
    DateField[auto_now=False, auto_now_add=False]):使用Python的datetime.date例項表示的日期
        引數DateField.auto_now:每次儲存物件時,自動設定該欄位為當前時間,用於"最後一次修改"的時間戳,它總是使用當前日期,預設為false
        引數DateField.auto_now_add:當物件第一次被建立時自動設定當前時間,用於建立的時間戳,它總是使用當前日期,預設為false
        該欄位預設對應的表單控制元件是一個TextInput. 在管理員站點添加了一個JavaScript寫的日曆控制元件,和一個“Today"的快捷按鈕,包含了一個額外的invalid_date錯誤訊息鍵
        auto_now_add, auto_now, and default 這些設定是相互排斥的,他們之間的任何組合將會發生錯誤的結果
    TimeField:使用Python的datetime.time例項表示的時間,引數同DateField
    DateTimeField:使用Python的datetime.datetime例項表示的日期和時間,引數同DateField
    FileField:一個上傳檔案的欄位
    ImageField:繼承了FileField的所有屬性和方法,但對上傳的物件進行校驗,確保它是個有效的image

欄位選項

通過欄位選項,可以實現對欄位的約束
在欄位物件時通過關鍵字引數指定
null:如果為True,Django 將空值以NULL 儲存到資料庫中,預設值是 False
blank:如果為True,則該欄位允許為空白,預設值是 False
對比:null是資料庫範疇的概念,blank是表單驗證證範疇的
db_column:欄位的名稱,如果未指定,則使用屬性的名稱
db_index:若值為 True, 則在表中會為此欄位建立索引
default:預設值
primary_key:若為 True, 則該欄位會成為模型的主鍵欄位
unique:如果為 True, 這個欄位在表中必須有唯一值

關係

關係的型別包括
ForeignKey:一對多,將欄位定義在多的端中
ManyToManyField:多對多,將欄位定義在兩端中
OneToOneField:一對一,將欄位定義在任意一端中
可以維護遞迴的關聯關係,使用'self'指定
用一訪問多:物件.模型類小寫_set
bookinfo.heroinfo_set
用一訪問一:物件.模型類小寫
heroinfo.bookinfo
訪問id:物件.屬性_id
heroinfo.book_id

元選項

 在模型類中定義類Meta,用於設定元資訊
    元資訊db_table:定義資料表名稱,推薦使用小寫字母,資料表的預設名稱
    <app_name>_<model_name>
    ordering:物件的預設排序欄位,獲取物件的列表時使用,接收屬性構成的列表
    class BookInfo(models.Model):
        ...
        class Meta():
            ordering = ['id']
    字串前加-表示倒序,不加-表示正序
    class BookInfo(models.Model):
        ...
        class Meta():
            ordering = ['-id']
    排序會增加資料庫的開銷

查詢集

 在管理器上呼叫過濾器方法會返回查詢集
    查詢集經過過濾器篩選後返回新的查詢集,因此可以寫成鏈式過濾
    惰性執行:建立查詢集不會帶來任何資料庫的訪問,直到呼叫資料時,才會訪問資料庫
    何時對查詢集求值:迭代,序列化,與if合用
    返回查詢集的方法,稱為過濾器
    all()返回全部
    filter()條件查詢
    exclude()包含不滿足給定的查詢引數的物件
    order_by()排序
    values():一個物件構成一個字典,然後構成一個列表返回
    寫法:
    filter(鍵1=值1,鍵2=值2)
    等價於
    filter(鍵1=值1).filter(鍵2=值2)
    返回單個值的方法
    get():返回單個滿足條件的物件
    如果未找到會引發"模型類.DoesNotExist"異常
    如果多條被返回,會引發"模型類.MultipleObjectsReturned"異常
    count():返回當前查詢的總條數
    first():返回第一個物件
    last():返回最後一個物件
    exists():判斷查詢集中是否有資料,如果有則返回True

欄位查詢

實現where子名,作為方法filter()、exclude()、get()的引數
語法:屬性名稱__比較運算子=值
表示兩個下劃線,左側是屬性名稱,右側是比較型別
對於外來鍵,使用“屬性名_id”表示外來鍵的原始值
轉義:like語句中使用了%與,匹配資料中的%與,在過濾器中直接寫,例如:filter(title__contains="%")=>where title like '%\%%',表示查詢標題中包含%的

比較運算子

 exact:表示判等,大小寫敏感;如果沒有寫“ 比較運算子”,表示判等
    filter(isDelete=False)
    contains:是否包含,大小寫敏感
    exclude(btitle__contains='傳')
    startswith、endswith:以value開頭或結尾,大小寫敏感
    exclude(btitle__endswith='傳')
    isnull、isnotnull:是否為null
    filter(btitle__isnull=False)
    在前面加個i表示不區分大小寫,如iexact、icontains、istarswith、iendswith
    in:是否包含在範圍內
    filter(pk__in=[1, 2, 3, 4, 5])
    gt、gte、lt、lte:大於、大於等於、小於、小於等於
    filter(id__gt=3)
    year、month、day、week_day、hour、minute、second:對日期間型別的屬性進行運算
    filter(bpub_date__year=1980)
    filter(bpub_date__gt=date(1980, 12, 31))
    range(一個範圍,使用元祖):
    Blog.objects.filter(id__range =(30,45))

跨關聯關係的查詢:處理join查詢

語法:模型類名 <屬性名> <比較>
注:可以沒有__<比較>部分,表示等於,結果同inner join
可返向使用,即在關聯的兩個模型中都可以使用
filter(heroinfo__hcontent__contains='八')
showmethe = UserInfo.objects.filter(addressinfo__reciever__contains = '張')
查詢的快捷方式:pk,pk表示primary key,預設的主鍵是id
filter(pk__lt=6)

Entry.objects.filter(blog__name='Beatles Blog')

聚合函式

使用aggregate()函式返回聚合函式的值
函式:Avg,Count,Max,Min,Sum
from django.db.models import Max
maxDate = list.aggregate(Max('bpub_date'))
count的一般用法:
count = list.count()

F物件

 可以使用模型的欄位A與欄位B進行比較,如果A寫在了等號的左邊,則B出現在等號的右邊,需要通過F物件構造
    list.filter(bread__gte=F('bcommet'))
    django支援對F()物件使用算數運算
    list.filter(bread__gte=F('bcommet') * 2)
    F()物件中還可以寫作“模型類__列名”進行關聯查詢
    list.filter(isDelete=F('heroinfo__isDelete'))
    對於date/time欄位,可與timedelta()進行運算
    list.filter(bpub_date__lt=F('bpub_date') + timedelta(days=1))

Q物件

    過濾器的方法中關鍵字引數查詢,會合併為And進行
    需要進行or查詢,使用Q()物件
    Q物件(django.db.models.Q)用於封裝一組關鍵字引數,這些關鍵字引數與“比較運算子”中的相同
    from django.db.models import Q
    list.filter(Q(pk__lt=6))

   Q物件可以使用&(and)、|(or)操作符組合起來
    當操作符應用在兩個Q物件時,會產生一個新的Q物件
    list.filter(pk_ _lt=6).filter(bcommet_ _gt=10)
    list.filter(Q(pk_ _lt=6) | Q(bcommet_ _gt=10))
    使用~(not)操作符在Q物件前表示取反
    list.filter(~Q(pk__lt=6))
    可以使用&|~結合括號進行分組,構造做生意複雜的Q物件
    過濾器函式可以傳遞一個或多個Q物件作為位置引數,如果有多個Q物件,這些引數的邏輯為and
    過濾器函式可以混合使用Q物件和關鍵字引數,所有引數都將and在一起,Q物件必須位於關鍵字引數的前面