1. 程式人生 > >Django 表關係

Django 表關係

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中定義,定義後所有查詢方法對自動過濾掉邏輯刪除的資料