Django中ORM模型總結(二)[模型類的對應關係,模型類的屬性,欄位型別]
阿新 • • 發佈:2019-01-09
模型類的對應關係
多對多
建立模型類----->新聞型別類
class TypeInfo(models.Model):
"""建立新聞模型類"""
tname = models.CharField(max_length=20)
建立模型類----->新聞內容類
class NewInfo(models.Model): """闖將新聞內容類""" ntitle = models.CharField(max_length=20) npub_date = models.DateTimeField(auto_now_add=True) ncontent = models.FileField() # 建立多對多的關係 ntype = models.ManyToManyField("TypeInfo")
總結:
- 建立多對多的語句寫在哪一行都可以
- 生成第三張表的表名為:(模型類名小寫_關聯屬性名)
- 建立的語句寫在了哪個模型類當中,決定生成第三張表名的名字
- 模型類名小寫為:建立語句所在的模型類的類名的小寫
一對多
總結(一)當中圖書和英雄的案例則為一對多的關係
建立語句寫在多的模型類當中
hbook = models.ForeignKey("BookInfo")
總結:
建立表後關聯欄位名稱為----關聯屬性_id
一對一
class Student(models.Model): """建立學生基本資訊模型類""" sname = models.CharField(max_length=20) sage = models.IntegerField()
class StuInfo(models.Model):
"""簡歷學生的詳細資訊類一對一的關係"""
scontent = models.CharField(max_length=200)
stu = models.OneToOneField("Student")
總結:
建立語句寫在哪一個模型類當中都可以
自關聯
描述:
自關聯是一種特殊的一對多的關係。
例:顯示廣州市的上級地區和下級地區。
地區表:id, title, parent
class AreaInfo(models.Model): """建立地區模型類""" atitle = models.CharField(max_length=20) aparent = models.ForeignKey("self", null=True, blank=True)
匯入資料資訊
注意:匯入資料時需要從areas.sql的當前所在資料夾進入資料庫
mysql終端中批量執行sql語句:
source areas.sql;
案例:
def area(request):
"""地區示例"""
# 1.獲取當前那的地區
# 2.id為440100的市為哪個省的
# 3.id為440100的市裡面有那些區
area = AreaInfo.objects.get(id=440100)
方法一:
parent = area.aparent
children = area.areainfo_set.all()
方法二:
parent = AreaInfo.objects.filter(areainfo__id=440100)
children = AreaInfo.objects.filter(aparent__id=440100)
return render(request, "booktest/area.html", {"area": area, "parent": parent, "children": children})
模型管理器:
BookInfo.objects.all()->objects是一個什麼東西呢?
答:objects是Django幫我自動生成的管理器,通過這個管理器可以實現對資料的查詢。
objects是models.Manger類的一個物件。自定義管理器之後Django不再幫我們生成預設的objects管理器。
自定義模型管理器:
- 自定義一個管理器類,這個類繼承models.Manger類。
- 再在具體的模型類裡定義一個自定義管理器類的物件
自定義管理器類的應用場景:
- 改變查詢的結果集。比如呼叫BookInfo.books.all()返回的是沒有刪除的圖書的資料。
- 新增額外的方法。如下:
管理器類中定義一個方法幫我們建立對應的模型類物件。
使用self.model()就可以建立一個跟自定義管理器對應的模型類物件。
例:
class BookInfoManage(models.Manager):
"""繼承模型管理器類"""
def all(self):
# 呼叫父類的__init__方法1(python2)
# Cat.__init__(self,name)
# 呼叫父類的__init__方法2
# super(Bosi,self).__init__(name)
# 呼叫父類的__init__方法3---->此方法為python3的方法
# super().__init__(name)
# books = models.Manager.all(self)
# books = super(models.Manager, self).all()
# books = super().all(self)
books = super(models.Manager, self).all()
books = books.filter(isDelete=0)
return books
def create_book(self, btitle, bpub_date):
"""自定義新增資料的方法"""
b = BookInfo()
# 方法二:此方法的優點,當模型的類名修改時不需要隨之修改名字
# b = self.model()
b.btitle = btitle
b.bpub_date = bpub_date
b.bread = 0
b.bcomment = 0
b.save()
自定義模型管理器的好處
- 可以更改父類的方法
- 根據自己的需求定義額外的對錶的一些操作
元選項
django預設生成的表名為 應用的名字_模型類的類名可以通過元選項的操作給表指定表名
需要在模型類中定義一個元類Meta,在裡面定義一個類屬性db_table就可以指定表名。
例:
class Meta():
"""自定一表名"""
db_table = "bookinfo"
# 注意是定義在模型類的裡面
查詢集:
- 查詢集表示從資料庫中獲取的物件集合,在管理器上呼叫某些過濾器方法會返回查詢集,
- 查詢集可以含有零個、一個或多個過濾器。過濾器基於所給的引數限制查詢的結果,從Sql的角度,
- 查詢集和select語句等價,過濾器像where和limit子句。
返回查詢集的過濾器如下:
- all(): 返回所有資料。
- filter(): 返回滿足條件的資料。
- exclude(): 返回滿足條件之外的資料,相當於sql語句中where部分的not關鍵字。
- order_by(): 對結果進行排序。
返回單個值的過濾器如下:
- get():返回單個滿足條件的物件
- 如果未找到會引發"模型類.DoesNotExist"異常。
- 如果多條被返回,會引發"模型類.MultipleObjectsReturned"異常。
- count():返回當前查詢的總條數
- aggregate():聚合
查詢集的兩大特性:
- 惰性執行:建立查詢集不會訪問資料庫,直到呼叫資料時,才會訪問資料庫,呼叫資料的情況包括迭代、序列化、與if合用。
- 快取:查詢集的結果被存下來之後,再次查詢時會使用之前快取的資料。
限制查詢集:
- 可以通過下標的方式對一個查詢集進行切片操作---從而達到限制查詢集的的結果
模型類屬性
屬性命名限制:
- 不能是python的保留關鍵字。
- 不允許使用連續的下劃線,這是由django的查詢方式決定的,在第4節會詳細講解查詢。
- 定義屬性時需要指定欄位型別,通過欄位型別的引數指定選項,語法如下:
格式:
屬性=models.欄位型別(選項)
欄位型別
使用時需要引入django.db.models包,欄位型別如下:
- AutoField:自動增長的IntegerField,通常不用指定,不指定時Django會自動建立屬性名為id的自動增長屬性。
- BooleanField:布林欄位,值為True或False。
- NullBooleanField:支援Null、True、False三種值。
- CharField(max_length=字元長度):字串。TextField:大文字欄位,一般超過4000個字元時使用。
- 引數max_length表示最大字元個數。
- IntegerField:整數。
- DecimalField(max_digits=None, decimal_places=None):十進位制浮點數。FloatField:浮點數。
- 引數max_digits表示總位數。
- 引數decimal_places表示小數位數。
- DateField[auto_now=False, auto_now_add=False]):日期。TimeField:時間,引數同DateField。
- 引數auto_now表示每次儲存物件時,自動設定該欄位為當前時間,用於"最後一次修改"的時間戳,它總是使用當前日期,預設為false。
- 引數auto_now_add表示當物件第一次被建立時自動設定當前時間,用於建立的時間戳,它總是使用當前日期,預設為false。
- 引數auto_now_add和auto_now是相互排斥的,組合將會發生錯誤。
- DateTimeField:日期時間,引數同DateField。
- FileField:上傳檔案欄位。
- ImageField:繼承於FileField,對上傳的內容進行校驗,確保是有效的圖片。
選項:
- null:如果為True,表示允許為空,預設值是False。
- blank:如果為True,則該欄位允許為空白,預設值是False。
- 對比:null是資料庫範疇的概念,blank是表單驗證證範疇的。
- db_column:欄位的名稱,如果未指定,則使用屬性的名稱。
- db_index:若值為True, 則在表中會為此欄位建立索引,預設值是False。
- default:預設值。
- primary_key:若為True,則該欄位會成為模型的主鍵欄位,預設值是False,一般作為AutoField的選項使用。
- unique:如果為True, 這個欄位在表中必須有唯一值,預設值是False。