模型類的對應關系
多對多
創建模型類----->新聞類型類
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")
總結:
- 建立多對多的語句寫在哪一行都可以
- 生成第三張表的表名為:(模型類名小寫_關聯屬性名)
- 建立的語句寫在了哪個模型類當中,決定生成第三張表名的名字
- 模型類名小寫為:建立語句所在的模型類的類名的小寫
更新語句
Models.objects.fileter().update(**info) # 返回更新的條數 Models.objects.all().update(**info)
刪除語句
Models.objects.fileter(條件).delete() # 返回刪除信息
一對多
總結(一)當中圖書和英雄的案例則為一對多的關系
創建語句寫在多的模型類當中
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,對上傳的內容進行校驗,確保是有效的圖片。
goods_type_id = models.SmallIntegerField(choices=goods_type_choice)

FRUITS = 1 # 新鮮水果 SEAFOOD = 2 # 海鮮水產 MEAT = 3 # 豬牛羊肉 EGGS = 4 # 禽類蛋品 VEGETABLES = 5 # 新鮮蔬菜 FROZEN = 6 # 速凍食品 GOODS_TYPE = { FRUITS: '新鮮水果', SEAFOOD: '海鮮水產', MEAT: '豬牛羊肉', EGGS: '禽類蛋品', VEGETABLES: '新鮮蔬菜', FROZEN: '速凍食品' } goods_type_choice = ((k, v) for k, v in GOODS_TYPE.items()) # choices的格式為一個元祖,元祖里面每一個元素還是元祖,(num, type) goods_type_id = models.SmallIntegerField(choices=goods_type_choice)
模型類的方法
- ._meta.get_all_field_names():獲取模型類的屬性列表(該方法在有些版本沒有使用下一個)
- 模型類._meta.get_fields():獲取到的不是一個列表如果需要列表需要自己拼接便利該方法返回結果,每個元素的name屬性

def get_all_valid_str_fields(self): """""" cls = self.model() attr_list = cls._meta.get_fields() valid = [] for list in attr_list: if isinstance(list, models.ForeignKey): # 如果時外鍵拼接一個‘外鍵_id’的樣式,插入數據時傳遞的參數為 外鍵_id # 而獲取到的是 外鍵 這樣傳遞過來的參數就會被出掉 list.name = '%s_id' % list.name valid.append(list.name) print(valid) return valid
- 模型類.get_full_path():獲取訪問的全部路徑
選項:
- null:如果為True,表示允許為空,默認值是False。
- blank:如果為True,則該字段允許為空白,默認值是False。
- 對比:null是數據庫范疇的概念,blank是表單驗證證范疇的。
- db_column:字段的名稱,如果未指定,則使用屬性的名稱。
- db_index:若值為True, 則在表中會為此字段創建索引,默認值是False。
- default:默認值。
- primary_key:若為True,則該字段會成為模型的主鍵字段,默認值是False,一般作為AutoField的選項使用。
- unique:如果為True, 這個字段在表中必須有唯一值,默認值是False。
抽象模型類
class Meta(): abstract = True # 抽象模型類
goods_type_id = models.SmallIntegerField(choices=goods_type_choice)