ORM基礎之字段及其參數介紹

複製代碼
1、外鍵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。



2、OneToOneField(一對一)
1、一般一對一字段用來擴展已有字段。

2、字段參數
    1.to
        設置要關聯的表。

    2.to_field
        設置要關聯的字段。

    3.on_delete
        同ForeignKey字段。


3、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)



4、元信息
    1、ORM對應的類裏面包含另外一個Meta類,而Meta類封裝了一些數據庫的信息。主要字段以下:

    2、元類屬性
        1.db_table
            ORM在數據庫中的表名默認是 app_類名,能夠經過db_table能夠重寫表名。

        2.index_together
            聯合索引。

        3.unique_together
            聯合惟一索引。

        4.ordering
            指定默認按什麼字段排序。
            只有設置了該屬性,咱們查詢到的結果才能夠被reverse()。
複製代碼
相關文章
相關標籤/搜索