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