1. 程式人生 > >Django中ORM模型總結(二)[模型類的對應關係,模型類的屬性,欄位型別]

Django中ORM模型總結(二)[模型類的對應關係,模型類的屬性,欄位型別]

模型類的對應關係

多對多

建立模型類----->新聞型別類

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")

總結:

  1. 建立多對多的語句寫在哪一行都可以
  2. 生成第三張表的表名為:(模型類名小寫_關聯屬性名)
  3. 建立的語句寫在了哪個模型類當中,決定生成第三張表名的名字
  4. 模型類名小寫為:建立語句所在的模型類的類名的小寫

一對多

總結(一)當中圖書和英雄的案例則為一對多的關係
建立語句寫在多的模型類當中

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管理器。

自定義模型管理器:

  1. 自定義一個管理器類,這個類繼承models.Manger類。
  2. 再在具體的模型類裡定義一個自定義管理器類的物件

自定義管理器類的應用場景:

  1. 改變查詢的結果集。比如呼叫BookInfo.books.all()返回的是沒有刪除的圖書的資料。
  2. 新增額外的方法。如下:

    管理器類中定義一個方法幫我們建立對應的模型類物件。
    使用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()

自定義模型管理器的好處

  1. 可以更改父類的方法
  2. 根據自己的需求定義額外的對錶的一些操作

元選項

django預設生成的表名為  應用的名字_模型類的類名可以通過元選項的操作給表指定表名


需要在模型類中定義一個元類Meta,在裡面定義一個類屬性db_table就可以指定表名。
例:

class Meta():
    """自定一表名"""
    db_table = "bookinfo"
    # 注意是定義在模型類的裡面

查詢集:

  1. 查詢集表示從資料庫中獲取的物件集合,在管理器上呼叫某些過濾器方法會返回查詢集,
  2. 查詢集可以含有零個、一個或多個過濾器。過濾器基於所給的引數限制查詢的結果,從Sql的角度,
  3. 查詢集和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。