1. 程式人生 > >Django中的模型關係

Django中的模型關係

一、模型對應關係

說明:針對模型類而言的,在模型中定義屬性(欄位)時完成模型關係的對應。

1、一對一

2、一對多

3、多對對

-----------------------------------------------------------------

1、一對一

class User(models.Model):
    #設定一對一的模型關係,不影響欄位引數或者說屬性引數,首位引數必須是建立關係的模型類
    shopcar = models.OneToOneField(Shopcar,null=True)

2、一對多

class Goods(models.Model):
    #ForeignKey使用在多對一中,變相的一對多關係
    Shopcar = models.ForeignKey(Shopcar)

3、多對對

models.ManyToMany(模型類)

二、刪除模式,on_delete=

主要針對主表的刪除,從表依賴主表的資料,所以主表不能隨意刪除,但是從表可以隨時刪除。

CASECADE:  預設,級聯刪除,刪除主表會連帶著刪除主表在從表中的資料。

PROTECT:保護模式,從表中有主表資料時不允許刪除,如果從表無主表資料是能夠刪除主表或者從表的。

DO_NOTHING: 什麼都不做,類似PROTECT

SET_NULL:將主表在從表中的資料設定為空,要求從表中該資料所在欄位允許為空。

SET_DEFAULT:將主表在從表中的資料設定為該欄位預設的值,要求該欄位有預設值。

三、關係查詢

說明:購物車和商品是一對多的關係,需要在從表也就是商品表中進行屬性表示

class Goods(models.Model):
    shopcar = models.ForeignKey(Shopcar)

1、正向查詢,通過主表查從表

說明:從表在主表中沒有任何表示,Django提供了:模型類_set用來獲取主表所對應的從表記錄。

#一對多的正向查詢,通過主表查從表
def oneTOMany(req):
    #由一查多,格式:多的模型類_set,獲取一的模型類所對應的所有多的模型記錄資料
    goods = Shopcar.objects.first().goods_set.all()

注意:goods_set中goods是模型類Goods首字母的小寫,而且必須要小寫。

2、反向查詢,通過從表查主表

說明:主表在從表中以屬性表示

def manyToOne(req):
    #shopcar是從表的屬性
    shopcar = Goods.objects.first().shopcar
    return HttpResponse('購物車:%s' %shopcar.uid.uname)

3、跨關係查詢

def find(req):
    #獲取購物車id=1的所有商品
    goods = Goods.objects.filter(shopcar__id=1)
    #獲取商品id=1所在的購物車
    car = Shopcar.objects.filter(goods__id=1)

注意:shopcar__id是兩個下劃線,並且shopcar是模型類Goods中屬性名;goods__id也是雙下劃線,並且goods是模型類Goods首字母小寫。

四、模型繼承

在Django中模型類是可以繼承的,同繼承一樣共有的資料在父類中,子類具備特有屬性。同樣這樣生成的表在資料庫中共有欄位存放在父表中,子表中存放自己特有的欄位。一般不這樣用而是抽象父類,將父類的屬性對應的欄位和子表的欄位都存放在字表中。

在元資訊中抽象父類:

class Animal(models.Model):
    class Meta:
        abstract=True