1. 程式人生 > >ORM基礎之欄位及其引數介紹

ORM基礎之欄位及其引數介紹

一、外來鍵ForeignKey
1、欄位引數
    1.to
        設定要關聯的表

    2.to_field
        設定要關聯的表的欄位(一般不設定,預設使用主鍵id關聯)

    3.related_name
        反向操作時,使用的欄位名,用於代替原反向查詢時的'表名_set'

    4.related_query_name
        反向查詢操作時,使用的連線字首,用於替換表名

    5.on_delete
        當刪除關聯表中的資料時,當前表與其關聯的行的行為。

        1.models.CASCADE
            刪除關聯資料,與之關聯的資料也刪除(on_delete
=models.CASCADE) 2.丟擲異常(錯誤) 1.models.DO_NOTHING 刪除關聯資料,引發錯誤IntegrityError 2.models.PROTECT 刪除關聯資料,引發錯誤ProtectedError 3.models.SET_NULL 刪除關聯資料,與之關聯的值設定為null(前提FK欄位需要設定為可空) 4.models.SET_DEFAULT 刪除關聯資料,與之關聯的值設定為預設值(前提FK欄位需要設定預設值)
5.models.SET 刪除關聯資料 a. 與之關聯的值設定為指定值,設定:models.SET(值) b. 與之關聯的值設定為可執行物件的返回值,設定:models.SET(可執行物件) 6.db_constraint 是否在資料庫中建立外來鍵約束,預設為True。 二、OneToOneField(一對一) 1、通常一對一欄位用來擴充套件已有欄位。 2、欄位引數 1.to 設定要關聯的表。 2.to_field 設定要關聯的欄位。
3.on_delete 同ForeignKey欄位。 三、ManyToManyField 1、用於表示多對多的關聯關係。在資料庫中通過第三張表來建立關聯關係。 2、欄位引數 1.to 設定要關聯的表 2.related_name 同ForeignKey欄位(反向操作時,使用的欄位名,用於代替原反向查詢時的'表名_set') 3.related_query_name 同ForeignKey欄位(反向查詢操作時,使用的連線字首,用於替換表名) 4.symmetrical 僅用於多對多自關聯時,指定內部是否建立反向操作的欄位。預設為True。 舉個例子: class Person(models.Model): name = models.CharField(max_length=16) friends = models.ManyToManyField("self") 此時,person物件就沒有person_set屬性。 class Person(models.Model): name = models.CharField(max_length=16) friends = models.ManyToManyField("self", symmetrical=False) 此時,person物件現在就可以使用person_set屬性進行反向查詢。 5.through 在使用ManyToManyField欄位時,Django將自動生成一張表來管理多對多的關聯關係。 但我們也可以手動建立第三張表來管理多對多關係,此時就需要通過through來指定第三張表的表名。 6.through_fields 設定關聯的欄位。 7.db_table 預設建立第三張表時,資料庫中表的名稱。 3、多對多的三種建立方式 1. 自己建立第三張關係表,外來鍵分別關聯兩個表 1. 優點 1. 可以擴充第三張關係標的欄位 2. 缺點 1. 自己做連表查詢 3. 建表例子 class Book(models.Model): title = models.CharField(max_length=12) class Author(models.Model): name = models.CharField(max_length=12) # 1. 多對多第一種建立方式:自己建立第三張關係表 class Author2Book(models.Model): id = models.AutoField(primary_key=True) author_id = models.ForeignKey(to='Author') book_id = models.ForeignKey(to='Book') price = models.IntegerField() # 可以自己擴充需要的欄位 2. 通過ORM內建的ManyToManyField,自動建立第三張關係表 1. 優點 1. 提供了很多連表操作的快捷方法--> all(), add(), set(), clear(), remove() 2. 缺點 1. 無法擴充套件第三張關係表 3. 建表例子 class Book(models.Model): title = models.CharField(max_length=12) class Author(models.Model): name = models.CharField(max_length=12) books = models.ManyToManyField(to='Book') # 欄位就這些,無法擴充其他欄位 3. 自己建立第三張關係表,通過ManyToManyField關聯 1. 優點: 1. 既能夠使用多對多查詢的快捷方法all()(只能用all,不能使用add,set等),還能夠自己擴充套件第三張關係表的欄位 2. 建表例子 class Book(models.Model): title = models.CharField(max_length=12) class Author(models.Model): name = models.CharField(max_length=12) # 告訴ManyToManyField通過(through)Author2Book這張表進行關聯,不使用ORM自動建立的第三張表,而是使用我自己建立的表 # through_fields告訴ORM通過哪幾個欄位進行多對多關聯 books = models.ManyToManyField(to='Book', through='Author2Book', through_fields=('author', 'book')) # 1. 多對多第三種建立方式:自己建立第三張關係表,此時外來鍵不需要新增_id了,因為ORM會預設幫你在外來鍵後面加_id class Author2Book(models.Model): id = models.AutoField(primary_key=True) author = models.ForeignKey(to='Author') book = models.ForeignKey(to='Book') price = models.IntegerField(null=True) # author_id和book_id要聯合唯一 class Meta: unique_together = (('author', 'book'),) 3. 操作例子 # 多對多的第三張方式也支援all查詢 author_obj = Author.objects.first() # 第一個作者的所有書籍 ret = author_obj.books.all() # 給第一個作者新增一本書 # author_obj.books.add(4) # 報錯 Author2Book.objects.create(author_id=1, book_id=4) 四、元資訊 1、ORM對應的類裡面包含另一個Meta類,而Meta類封裝了一些資料庫的資訊。主要欄位如下: 2、元類屬性 1.db_table ORM在資料庫中的表名預設是 app_類名,可以通過db_table可以重寫表名。 2.index_together 聯合索引。 3.unique_together 聯合唯一索引。 4.ordering 指定預設按什麼欄位排序。 只有設定了該屬性,我們查詢到的結果才可以被reverse()。