Django架構——模型(資料庫操作)

來源:互聯網
上載者:User

標籤:models   py   

-- models.py

-- ORM(object-relation mapping) 實現資料模型與資料庫的解耦;

# 對象,關係,映射;

1.根 據對象的類型產生表結構;

2.將對象、列表的操作,轉換為sql語句;

3.將sql查詢到的結果轉換為對象、列表;


-- 欄位類型

# 所有欄位類型被定義在django.db.models.fields目錄下,

# 方便使用,被匯入到django.db.models中;

1.AutoField 自動成長 # 通常不用指定

2.BooleanField 布爾類型

3.NullBooleanField 支援布爾值與null

4.CharField(max_length=長度) 字串 # 必須指定最大長度

5.TextFeild 大文字欄位

6.IntegerField 整數

7.DecimalField(max_digits=None,decimal_places=None) # 浮點數,總位元,小數位元

8.DateField([auto_now=False, auto_now_add=False]) # 儲存對象時間;建立對象時間;

9.TimeField 時間 # 同DateField

10.DateTimeField 日期時間 # 同DateField

11.FileField 上傳檔案時間

12.ImageField # 繼承與FileField,對上傳內容進行校正

13.BigIntegerField 64位整數

14.SmallIntegerField

-- 欄位命名限制

1.非python保留字

2.不能有連續底線,查詢中有;


-- 欄位選項(資料庫中的約束)

1.null 

2.blank

3.db_column  # 自訂欄位名

4.db_index

5.default

6.primary_key

7.unique


-- 關係欄位類型

1.ForeignKey 一對多

manufacturer.car_set.all()

2.OneToOneField 一對一

3.ManyToManyField 多對多


-- 元選項

# 建立模型類之後自訂表格名class Meta:‘‘‘自訂表格名‘‘‘db_table = ‘bookinfo‘# 在產生遷移之後的0001——initial.py檔案中多處一個;# option={‘db_table‘:‘bookinfo‘ # 表示表的名字已經被自訂了;# 預設產生的表的名字是:應用程式名稱_小寫模型類名;# 如:booktest_heroinfo;}# 表示當前不是模型類,模型不會被用來建立所有資料表class Meta:‘‘‘表示當前類不是模型類,而是其他模型的抽象基類‘‘‘abstract = True# 繼承模型類,調用其方法

-- 測試資料

# class BookInfo(models.Model):# btitle = models.CharField(max_length=20)# bpub_date = models.DateTimeField()# bread = models.IntegerField(default=0)# bcomment = models.IntegerField(default=0)# isDelete = models.BooleanField(default=False)# class Meta:# db_table = ‘bookinfo‘# class HeroInfo(models.Model):# hname = models.CharField(max_length=20)# hgender = models.BooleanField(default=True)# isDelete = models.BooleanField(default=False)# hcontent = models.CharField(max_length=100)# hbook = models.ForeignKey(‘BookInfo‘)# insert into bookinfo(btitle,bpub_date,bread,bcomment,isDelete) values# (‘射鵰英雄傳‘,‘1980-5-1‘,12,34,0),# (‘天龍八部‘,‘1986-7-24‘,36,40,0),# (‘笑傲江湖‘,‘1995-12-24‘,20,80,0),# (‘雪山飛狐‘,‘1987-11-11‘,58,24,0);# insert into model_heroinfo(hname,hgender,hbook_id,hcontent,isDelete) values# (‘郭靖‘,1,1,‘降龍十八掌‘,0),# (‘黃蓉‘,0,1,‘打狗棍法‘,0),# (‘黃藥師‘,1,1,‘彈指神通‘,0),# (‘歐陽鋒‘,1,1,‘蛤蟆功‘,0),# (‘梅超風‘,0,1,‘九陰白骨爪‘,0),# (‘喬峰‘,1,2,‘降龍十八掌‘,0),# (‘段譽‘,1,2,‘六脈神劍‘,0),# (‘虛竹‘,1,2,‘天山六陽掌‘,0),# (‘王語嫣‘,0,2,‘神仙姐姐‘,0),# (‘令狐沖‘,1,3,‘獨孤九劍‘,0),# (‘任盈盈‘,0,3,‘彈琴‘,0),# (‘嶽不群‘,1,3,‘華山劍法‘,0),# (‘東方不敗‘,0,3,‘葵花寶典‘,0),# (‘胡斐‘,1,4,‘胡家刀法‘,0),# (‘苗若蘭‘,0,4,‘黃衣‘,0),# (‘程靈素‘,0,4,‘醫術‘,0),# (‘袁紫衣‘,0,4,‘六合拳‘,0);


-- 模型類方法

1.str方法# 返回模型類對象的描述2.save方法# 將對象儲存至資料庫3.delete方法# 串聯刪除  user=models.ForeignKey(user,blank=True,null=True,on_delete=models.SET_NULL)# 沒看懂


-- 管理器(模型的成員)

# 模型類的屬性,將對象與資料表映射;

-- 類的屬性

# objects是Manager類型的對象,django中定義好的類,用於資料庫的互動;# 如果沒有指定,預設提供一個管理器objects;


-- 修改管理器名稱(預設objects)

# models.py檔案中from django.db import modelsclass Person(models.Model):# 這個模型類裡面有一個屬性叫做personperson = models.Mangager()# 在Manager()類中完成欄位資訊的映射;


-- 自訂管理器

# 預設管理器方法太少,可以通過自訂管理器來新增方法;

-- 修改管理器返回的原始查詢集

class BookInfoManager(models.Manager):def get_queryset(self):return super(BookInfoManager, self).get_queryset().filter(isDelete=False)# 修改父類Manager中的get_queryset()方法,在父類方法後面添加一個filter(isDelete=Fales);# super(BookInfoManager, self).get_queryset()表示父類的方法;
class BookInfo(models.Model):... 欄位賦值books1 = BookInfoManger()  # 表示重寫父類後,重新定義給新的管理器;


-- 向管理器類中添加額外的方法

# 模型類中無法再使用__init__方法,因為父類已經使用建立了很多東西;# 所以,我們通過在模型類中使用類方法;@classmethoddef create(cls, btitle, bpub_date):b = BookInfob.btitle = btitle...return b或者:在自訂管理器中添加上面的方法;(推薦使用)


-- 查詢

-- 擷取所有對象

object1 = 表名.objects.all()# bookinfo = BookInfo.objects.all()# 可以通過切片選擇範圍內對象(限制查詢集合)object2 = 表名.objects.all()[1,3]


-- 過濾器(查詢集的方法)

-- 條件查詢

1.filter() # 滿足查詢,始終返回一個查詢集,列表2.exclude() # 不滿足查詢3.order_by()4.values()  5.all()

-- 文法規則:

# 表名.objects.filter(欄位名__運算子判斷=‘值‘)

-- 運算子

1.exact  # 精確匹配2.contains  # 包含3.startswith  # 以指定值開頭4.endswith  # 以指定值結束5.isnull  # 不為空白6.in  # 範圍內查詢7.gt/gte/lt/lte# 運算子前加上i,不區分大小寫;

-- 例子 

# filter()過濾器# 精確查詢bookinfo_3 = BookInfo.objects.filter(id__exact=1)print(bookinfo_3)# 包含查詢bookinfo4 = BookInfo.objects.filter(book_title__contains=‘八‘)print(bookinfo4)# 首字查詢bookinfo5 = BookInfo.objects.filter(book_title__startswith=‘天‘)print(bookinfo5)# 尾字查詢bookinfo6 = BookInfo.objects.filter(book_title__endswith=‘傳‘)print(bookinfo6)# 查看不為空白的欄位值bookinfo7 = BookInfo.objects.filter(book_title__isnull=False)print(bookinfo7)# 查詢指定編號範圍的欄位值bookinfo8 = BookInfo.objects.filter(pk__in=[1,3])print(bookinfo8)# 查詢大小範圍內的欄位值bookinfo9 = BookInfo.objects.filter(id__gt=3)print(bookinfo9)# exclude()過濾器bookinfo10 = BookInfo.objects.exclude(id__gt=3)print(bookinfo10)


-- 返回單個值的方法

-- get 擷取單一對象

bookinfo11 = BookInfo.objects.get(book_title = ‘天龍八部‘)print(bookinfo11)# get如果查詢的不僅一個對象,會觸發MultipleObjectsReturned異常bookinfo12 = BookInfo.objects.get(id__gt=2)print(bookinfo12)# get如果查詢不到對象,會觸發DoesNotExist異常bookinfo13 = BookInfo.objects.get(book_title = ‘天龍七部‘)print(bookinfo13)-- count()-- first()-- last()-- exists()


-- F對象和Q對象

# 需要匯入模組中的對象

from django.db.models import F, Q


-- F對象

# 實現兩個屬性之間的比較bookinfo14 = BookInfo.objects.filter(book_read__gte=F(‘book_comment‘))print(bookinfo14)# 可以在F()對象上使用算數運算bookinfo15 = BookInfo.objects.filter(book_read__gte=F(‘book_comment‘)*2)print(bookinfo15)


-- Q對象(query查詢)

# 構造查詢對象-- 邏輯與:多個過濾器逐個調用bookinfo16 = BookInfo.objects.filter(book_read__lte=40, id__lte=3)print(bookinfo16)bookinfo17 = BookInfo.objects.filter(book_read__lte=40).filter(id__lte=3)print(bookinfo17)-- 利用Q對象實現,或與非-- 基本文法Q(屬性名稱__運算子=值)# &表示邏輯與,|表示邏輯或bookinfo18 = BookInfo.objects.filter(Q(book_read__lte=40) & Q(id__lte=3))print(bookinfo18)bookinfo19 = BookInfo.objects.filter(Q(book_read__lte=40) | Q(id__lte=3))print(bookinfo19)


-- 彙總函式

# 需要匯入模組from django.db.models import *表名.objects.aggregate(Sum(欄位名))1.Avg2.Count# 查詢總數的時候一般不使用;# BookInfo.objects.count() 替代;3.Max4.Min5.Sumbookinfo20 = BookInfo.objects.aggregate(Sum(‘book_read‘))print(bookinfo20)


-- 關聯查詢

-- 一對多,一類

1.擷取單一欄位對象object1 = 表名.objects.get(‘條件‘)# book = BookInfo.objects.get(id=1)2.擷取對應所有所有對象資訊object2 = object1.小寫表名_set.all()# heroes = book.heroinfo_set.all()

-- 多對一,多類

1.擷取單一欄位對象object1 = 表名.objects.get(‘條件‘)# hero = HeroInfo.objects.get(id=1)2.擷取對應對象資訊object1.欄位屬性# hero.hero_book

-- 通過模型類實現關聯查詢

# 暫略


-- 自關聯

# 略


Django架構——模型(資料庫操作)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.