Django 表關係
阿新 • • 發佈:2018-11-06
1、關聯關係
1、一對一
2、一對多
3、多對多
2、一對一關係
場景:人(1個)---身份證(1個) 1:1
外來鍵關聯格式:
關聯的屬性 = models.OneToOneField(關聯表的類名)
django會自動的去外來鍵關聯
1、設計模型
1、人 Person name 姓名 age 年齡 2、身份證 IDCard idNumber 身份證號 address 地址 sex 性別 person---外來鍵---OneToOneField 一對一 例:i_person = models.OneToOneField(Person)
2、插入資料
1、人 def savePerson(request): person = Person() person.p_name = "麻花4" person.p_age = 27 person.save() return HttpResponse('插入成功') 2、身份證 def saveIDCard(request): idcard = IDCard() idcard.i_address = '湖南' idcard.i_idnumber = 1111 # 先找到需要繫結的人 person = Person.objects.filter(p_name='麻花').first() # 外來鍵---繫結物件 idcard.i_person = person idcard.save() return HttpResponse('插入身份證')
3、刪除
def delPerson(request):
person = Person.objects.filter(p_name='麻花').first()
person.delete()
return HttpResponse('刪除成功')
1、如果刪除的是主表中的資料,如果在從表中沒有對應的資料,會直接刪除該資料;
如果在從表中存在對應的資料,會連同從表中的資料一同刪除。
2、如果刪除的是從表中的資料,會直接刪除該資料,主表中的資料不會受影響。
4、表的關係(主—從)
主表(被動連結的一方) --- 從表(主動連結的一方)
5、設定外來鍵關聯的資料的保護模式
如:i_person = models.OneToOneField(Person,on_delete = models.PROTECT)
models.CASCADE 預設模式
如果刪除的是主表中的資料,如果在從表中存在對應的資料,會連同從表中的資料一同刪除。
models.PROTECT 保護模式
當刪除主表的資料的時候,如果有對應的從表資料,則不能刪除,程式報錯,如果沒有對應的從表資料,則正常刪除。
models.SET_DEFAULT 設定為預設值
當刪除主表的資料,如果對應的從表有資料,則主表資料直接刪除,從表對應的外來鍵自動設定為預設值。
models.SET_NULL 設為空值
當刪除主表資料的資料,如果有對應的從表資料,則主表資料直接刪除,從表對應的外來鍵自動設定為空值。
models.SET(value) 設為指定的值
當刪除主表的資料時,如果有對應的從表資料,則主表資料直接刪除,從表對應的外來鍵自動設定為指定的值。
3、一對多
場景:人(1個)---愛好(多個) 1:N
外來鍵關聯格式:
關聯的屬性 = models.ForeignKey(關聯表的類名)
1、設計表
1、人 Person
name 姓名
age 年齡
2、愛好 hobby
name 愛好名
price 愛好的花費
外來鍵:
person = models.ForeginKey(類名)
2、新增資料
1、人
def savePerson(request):
person = Person()
person.p_name = "麻花4"
person.p_age = 27
person.save()
return HttpResponse('插入成功')
2、愛好
def saveHobby(request):
hobby = Hobby()
hobby.h_name = '小電影'
hobby.h_price = 0
person = Person.objects.filter(p_name = '麻花4').first()
hobby.h_person = person
hobby.save()
return HttpResponse('插入成功')
** 可以給一個人繫結多個愛好
3、修改資料+外來鍵關聯資料的保護模式
與上面所寫一對一一樣
4、多對多
場景:
使用者(1個) ----- 商品(多個)
商品(1個) ------使用者(多個)
使用者(多個) -----商品(多個)
外來鍵關聯格式:
關聯的屬性 = models.ManyToManyField(關聯表的類名)
1、設計模型
1、buyer 使用者
name 名字
age 年齡
2、goods 商品
name 商品名
price 商品價格
例:g_buyer = models.ManyToManyField(Buyer)
將相對不重要的表設定外來鍵關聯
3、第三張表用來維護兩張表的關係
django可以自動生成
外來鍵關聯使用者id
外來鍵關聯商品id
2、新增資料
def saveBuyerGoods(request):
# 獲得購買者
buyer = Buyer.objects.filter(pk=1).first()
buyer2 = Buyer.objects.filter(pk=2).first()
buyer3 = Buyer.objects.filter(pk=3).first()
# 獲得商品
goods = Goods.objects.filter(pk=1).first()
# 新增資料,一對多的關係時,用add表示新增,且可以新增多個
goods.g_buyer.add(buyer)
goods.g_buyer.add(buyer2)
goods.g_buyer.add(buyer3)
goods.save()
return HttpResponse('插入訂單成功')
3、刪除資料
1.主表(購買者)
2.主表(商品)
3.(從表)自動生成的表
如果刪除的是主表中的資料,如果從表中沒有關聯的資料,直接刪除 ;如果從表中有關聯的資料,會連同從表中的關聯資料(多條)一同刪除。
4、查詢
1、一對一
1、自己查詢自己,直接查詢到對應的物件即可
2、根據從表中的資訊查詢主表資訊
從表中有一個外來鍵關聯的欄位,該欄位與模型中的屬性對應,我們可以直接通過該外來鍵屬性,獲取到關聯的資料物件
如:person = idcard.i_person
3、根據主表資訊查詢從表資訊
django在建立主表與從表關係時,會自動為主表對應的模型建立一個隱式屬性,該隱式屬性就是對應的從表資料物件。
格式:主表模型物件.從表模型名的全小寫 即可獲得從表資料
如:idcard = person.idcard
2、一對多
1、根據從表中的資訊查詢主表中的資訊
可以直接根據外來鍵屬性獲取物件
2、根據主表中的資訊查詢從表中的資訊
格式:主表模型物件.從表模型名的全小寫_set.查詢方法
即可以直接獲得從表中對應的多條資料
如:hobbys = person.hobby_set.all()
3、多對多
1、根據從表中的資訊查詢主表中(多條)資訊
格式:從表模型物件.外來鍵屬性.查詢方法
如:buyers = goods.g_buyer.all()
2、根據主表中的資訊查詢從表中(多條)資訊
格式:主表模型物件.從表模型名的全小寫_set.查詢方法
如:goodses = buyer.goods_set.all()
5、django中的隱式屬性,顯示屬性
1、顯示屬性
開發人員直接定義的屬性就是顯示屬性
2、隱式屬性
在django中,django為了便於發開提供了很多隱式屬性(django自帶的),這些隱式屬性有很大的功能,如:查詢、建立...
6、自定義的manager
需求1:方便的建立測試資料
1、自定義manager的使用
1、在models中定義一個類(myManager)繼承Manager
from django.db.models_import Manager
2、在類中可以定義自己的方法
如:方便的建立測試資料
def createTestStudnet(self,name,age):
student = Student()
student.s_name = name
student.s_age = age
# .....
student.save()
3、在對應的迷行類中新增一個屬性,該屬性為自定義manager物件
如:mymanager = myManager()
注意:Manager物件就是我們平時常用的objects物件,如果自己定義manager物件,那麼objects物件不能使用,應使用自己定義的manager物件
如: Student.mymanager.createTestStudnet("瑪花",34)
格式:類名.自己定義的manager物件名.方法()
需求2:過濾掉已經被邏輯刪除的資料
def get_queryset(self):
return super(MyStudentManager, self).get_queryset().exclude(s_isdelete=True)
以上方法需要在myManager中定義,定義後所有查詢方法對自動過濾掉邏輯刪除的資料