1. 程式人生 > >$Django 多表操作(增刪改查,基於雙下劃線的查詢)

$Django 多表操作(增刪改查,基於雙下劃線的查詢)

 1 建立多表模型(詳情見程式碼)
  #用了OneToOneFieldForeignKey,模型表的欄位,後面會自定加_id

class Zuozhe (models.Model):
id = models.AutoField (primary_key=True)
name = models.CharField (max_length=32)
xiang = models.OneToOneField (to='Xiang', to_field='id')

  # ManyToManyField會自動建立第三張表:格式如下

class Zuozhe (models.Model):
id = models.AutoField (primary_key=True)
class Books (models.Model):
id = models.AutoField (primary_key=True)
name = models.CharField (max_length=32)
price = models.DecimalField (max_digits=5, decimal_places=2)
banse = models.ForeignKey (to=Banse, to_field='id')


zuozhe = models.ManyToManyField (to='Zuozhe')

  # *************重點
  # 一對一的關係:OneToOneField
  # 一對多的關係:ForeignKey
  # 多對多的關係:ManyToManyField
  
 2 新增表記錄
  1 一對多新增
   -兩種方式:
    -publish=物件
    -publish_id=id

models.Book.objects.create(name='紅樓夢',price=34.5,publish_id=1)
publish=models.Publish.objects.get (pk=1)
models.Book.objects.create (name='西遊記', price=34.5, publish=publish)

  2 一對多刪除:同單表刪除 delete()

  3 一對多修改:兩種方式,可以傳物件,可以傳id, update()
  4 一對一跟一對多一樣
  5 多對多:
   -add  ----->可以傳物件,可以傳id,可以傳多個

# book=models.Books.objects.filter(name='新增1').first()
# book.zuozhe.add(1,2)


   -remove  ----->可以傳物件,可以傳id,可以傳多個
   -clear  ---->沒有引數
   -set   修改 ----->必須傳可迭代物件(一般列表),列表裡面可以是物件,可以是id (舉例:這本書的作者,set([1,2,3] 表裡有就不改動了,沒有新增,這本書之前的其他作者刪除))

book=models.Books.objects.filter(name='新增1').first()
book.zuozhe.set ([3, 2, 1])

 3 基於物件的跨表查詢
  1 一對一
   正向:正向查詢按欄位

   反向:反向查詢按表名小寫
  2 一對多
   正向:正向查詢按欄位
   反向:反向按表名小寫_set.all()
  3 多對多
   正向:正向查詢按欄位
   反向查詢:反向按表名小寫_set.all()
  4******基於物件的查詢,多次查詢(子查詢)
 

總結:  .all()|表名小寫_set.all()|按欄位  


 
 4 基於雙下劃線的跨表查詢 
  -連表查詢
  -一對一雙下劃線查詢
   -正向:按欄位,跨表可以在filter,也可以在values
   -反向:按表名小寫,跨表可以在filter,也可以在values

# models.Books.objects.filter(name__startswith='紅').values('zuozhe__xiang__address').filter(zuozhe__xiang__address__startswith='北').values('zuozhe__xiang__sex')