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()。