$Django 多表操作(增刪改查,基於雙下劃線的查詢)
1 建立多表模型(詳情見程式碼)
#用了OneToOneField和ForeignKey,模型表的欄位,後面會自定加_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')