1. 程式人生 > >Django2.0-db(4)-Field常用引數,Meta設定,外來鍵

Django2.0-db(4)-Field常用引數,Meta設定,外來鍵

Field常用引數

null

  • 預設為False。如果設定為TrueDjangoi會在對映表的時候指定是否為空。
  • 在使用字串相關的Field(比如CharFieldTextField),官方推薦不要使用該引數,即預設False
  • Django在處理字串相關的Field,即使這個Fieldnull= False,如果你沒有給這個Field傳遞任何值,Django也會使用一個空的字串""來作為預設值儲存進去。
    • 如果此時再使用null=TrueDjango就會產生兩種空值的情形(NULL或者空字串)。
    • 如果想要在表單驗證的時候允許這個字串為空,那麼建議使用blank=True
    • 如果你的Field
      BooleanField,則對應的可空欄位為NullBooleanfield

blank

  • 標識這個欄位在表單驗證的時候是否可以為空。 預設False
  • null的區別
    • null是純資料庫級別
    • blank是表單驗證級別

db_column

  • 欄位在資料庫中的名字。如果沒有設定這個屬性,那麼將會使用模型中屬性的名字

default

  • 預設值。可以為一個值或者一個函式(不是函式呼叫!)。但是不支援lambda表示式。並且不支援列表/字典/集合等可變的資料結構

primary_key

  • 是否為主鍵。預設是False

unique

  • 在表中這個欄位的值是否唯一。一般是設定手機號碼/郵箱等。

模型的Meta設定

  • 對於模型級別的配置。可以在模型中定義一個類,叫做Meta。然後再這裡類中新增一些類屬性來控制模型的作用。

db_table

  • 這個模型對映到資料庫中的表名。如果沒有指定這個引數,那麼在對映的時候將會使用模型名來作為預設的表名。

ordering

  • 設定在提取資料的排列方式。

    class Book(models.MODEL):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=100)
        
        def __str__(self):
            return
    "<Book:id:'%s' name:'%s'>" % (id, name) class Meta: db_table = "book_table" # 對映到資料的表名就是book_table ordering = ['-id'] # 列表 形式,-號表示倒序

外來鍵

  • MySQL中,表有兩種引擎,一種是InnoDB,另外一種是myisam。如果使用的是InnoDB引擎,是支援外來鍵約束的。外來鍵的存在使得ORM框架在處理表關係的時候異常的強大。因此這裡我們首先來介紹下外來鍵在Django中的使用。

  • 類定義為class ForeignKey(to,on_delete,**options)。第一個引數是引用的是哪個模型,第二個引數是在使用外來鍵引用的模型資料被刪除了,這個欄位該如何處理。

  • 這裡以一個實際案例來說明。比如有一個User和一個Article兩個模型。一個User可以發表多篇文章,一個Article只能有一個Author,並且通過外來鍵進行引用。那麼相關的示例程式碼如下:

    class User(models.Model):
        username = models.CharField(max_length=20)
        password = models.CharField(max_length=100)
    
    
    class Article(models.Model):
        title = models.CharField(max_length=100)
        content = models.TextField()
    
        author = models.ForeignKey("User",on_delete=models.CASCADE)
    
  • 以上使用ForeignKey來定義模型之間的關係。即在article的例項中可以通過author屬性來操作對應的User模型。示例程式碼如下:

    article = Article(title='abc',content='123')
    author = User(username='張三',password='111111')
    article.author = author
    article.save()
    
    # 修改article.author上的值
    article.author.username = '李四'
    article.save()
    
  • 為什麼使用了ForeignKey後,就能通過author訪問到對應的user物件呢。因此在底層,DjangoArticle表添加了一個屬性名_id的欄位(比如author的欄位名稱是author_id),這個欄位是一個外來鍵,記錄著對應的作者的主鍵。以後通過article.author訪問的時候,實際上是先通過author_id找到對應的資料,然後再提取User表中的這條資料,形成一個模型。

  • 如果想要引用另外一個app的模型,那麼應該在傳遞to引數的時候,使用app.model_name進行指定。以上例為例,如果UserArticle不是在同一個app中,User在appuser中,那麼在引用的就應該這樣寫:

    # User模型在user這個app中
    class User(models.Model):
        username = models.CharField(max_length=20)
        password = models.CharField(max_length=100)
    
    # Article模型在article這個app中
    class Article(models.Model):
        title = models.CharField(max_length=100)
        content = models.TextField()
    
        author = models.ForeignKey("user.User",on_delete=models.CASCADE)
    
  • 如果模型的外來鍵引用的是本身自己這個模型,那麼to引數可以為'self',或者是這個模型的名字。在論壇開發中,一般評論都可以進行二級評論,即可以針對另外一個評論進行評論,那麼在定義模型的時候就需要使用外來鍵來引用自身。示例程式碼如下:

    class Comment(models.Model):
        content = models.TextField()
        origin_comment = models.ForeignKey('self',on_delete=models.CASCADE,null=True)
        # 或者
        # origin_comment = models.ForeignKey('Comment',on_delete=models.CASCADE,null=True)
    

外來鍵刪除操作

如果一個模型使用了外來鍵。那麼在對方那個模型被刪掉後,該進行什麼樣的操作。可以通過on_delete來指定。可以指定的型別如下:

  1. CASCADE:級聯操作。如果外來鍵對應的那條資料被刪除了,那麼這條資料也會被刪除。
  2. PROTECT:受保護。即只要這條資料引用了外來鍵的那條資料,那麼就不能刪除外來鍵的那條資料。
  3. SET_NULL:設定為空。如果外來鍵的那條資料被刪除了,那麼在本條資料上就將這個欄位設定為空。如果設定這個選項,前提是要指定這個欄位可以為空。
  4. SET_DEFAULT:設定預設值。如果外來鍵的那條資料被刪除了,那麼本條資料上就將這個欄位設定為預設值。如果設定這個選項,前提是要指定這個欄位一個預設值。
  5. SET():如果外來鍵的那條資料被刪除了。那麼將會獲取SET函式中的值來作為這個外來鍵的值。SET函式可以接收一個可以呼叫的物件(比如函式或者方法),如果是可以呼叫的物件,那麼會將這個物件呼叫後的結果作為值返回回去。
  6. DO_NOTHING:不採取任何行為。一切全看資料庫級別的約束。

以上這些選項只是Django級別的,資料級別依舊是RESTRICT!