django之orm多表操作1

2022-09-13 03:18:09 字數 4776 閱讀 4477

三種關係:一對一,一對多,多對多

一對一

xx = models.onetoonefield(to='表名',to_field='欄位名',on_delete=models.cascade) #刪除時的一些級聯效果,to_field可以不寫,預設是關聯到另一張表的主鍵,on_delete在1.x版本的django中不用寫,預設是級聯刪除的,2.x版本的django要寫.

一對多xx = models.foreignkey(to='表名',to_field='欄位名',on_delete=models.cascade)

多對多 xx = models.manytomanyfield(to='另外乙個表名') #這是自動建立第三表 示例

from django.db import models

# create your models here.

from django.db import models

# create your models here.

#作者表

class author(models.model): #比較常用的資訊放到這個表裡面

name=models.charfield( max_length=32)

age=models.integerfield()

# authordetail=models.onetoonefield(to="authordetail",to_field="nid",on_delete=models.cascade)

authordetail=models.onetoonefield(to='authordetail') #一對一到authordetail表 生成為表字段之後,會自動變為authordetail_id這樣有乙個名稱

# 外來鍵字段 -- 外來鍵欄位名_id

# foreign+unique

def __str__(self):

return self.name

#作者詳細資訊表

class authordetail(models.model):

birthday=models.datefield()

# telephone=models.bigintegerfield()

telephone=models.charfield(max_length=32)

addr=models.charfield( max_length=64)

def __str__(self):

return self.addr

#出版社表 和 書籍表 是 一對多的關係

class publish(models.model):

name=models.charfield( max_length=32)

city=models.charfield( max_length=32)

email=models.emailfield() #charfield -- asdfasdf

def __str__(self):

return self.name

#書籍表

class book(models.model):

nid = models.autofield(primary_key=true)

title = models.charfield( max_length=32)

publishdate=models.datefield()

price=models.decimalfield(max_digits=5,decimal_places=2) #decimal(16,2)

publishs=models.foreignkey(to="publish")

authors=models.manytomanyfield(to='author',)

def __str__(self):

return self.title

#手動建立第三張表,暫時忽略

# class booktoauthor(models.model):

# book_id = models.foreignkey(to='book')

# author_id = models.foreignkey(to='author')

# # xx = models.charfield(max_length=12)

增刪改查

#1 增

#1.1 一對一增加

# new_author_detail = models.authordetail.objects.create(

# birthday='1979-08-08',

# telephone='138383838',

# addr='黑龍江哈爾濱'

# )# obj = models.authordetail.objects.filter(addr='山西臨汾').first()

#方式1

# models.author.objects.create(

# name='王濤',

# age='40',

# authordetail=new_author_detail,

# )# 方式2 常用

# models.author.objects.create(

# name='王濤',

# age='40',

# authordetail_id=obj.id,

# )# 一對多

#方式1

# obj = models.publish.objects.get(id=2)

# models.book.objects.create(

# title = '李帥的床頭故事',

# publishdate='2019-07-22',

# price=3,

# # publishs=models.publish.objects.get(id=1),

# publishs=obj,

## )

# 方式2 常用

# models.book.objects.create(

# title='李帥的床頭故事2',

# publishdate='2019-07-21',

# price=3.5,

# # publishs=models.publish.objects.get(id=1),

# publishs_id=obj.id

## )

# 多對多

# 方式1 常用

# book_obj = models.book.objects.get(nid=1)

# book_obj.authors.add(*[1,2])

# 方式2

# author1 = models.author.objects.get(id=1)

# author2 = models.author.objects.get(id=3)

# book_obj = models.book.objects.get(nid=5)

# book_obj.authors.add(*[author1,author2])

一對一和一對多的刪除和單錶刪除是一樣的

# 一對一 表一外來鍵關聯到表二,表一刪除,不影響表2,表2刪除會影響表1

# models.authordetail.objects.get(id=2).delete()

# models.author.objects.get(id=3).delete()

# 一對多

# models.publish.objects.get(id=1).delete()

# models.book.objects.get(nid=1).delete()

# 多對多關係刪除

# book_obj = models.book.objects.get(nid=6)

# book_obj.authors.remove(6)

# book_obj.authors.remove(*[5,6])

# book_obj.authors.clear()

# book_obj.authors.add(*[1,])

# book_obj.authors.set('1')

# book_obj.authors.set(['5','6']) #刪除然後更新

更新

# 更新

# 一對一

# models.author.objects.filter(id=5).update(

# name='崔老師',

# age=16,

# # authordetail=models.authordetail.objects.get(id=5),

# authordetail_id=4,

# )#一對多

# models.book.objects.filter(pk=4).update(

# title='b哥的往事2',

# # publishs=models.publish.objects.get(id=3),

# publishs_id=3,

# )#一對多

models.publish.objects.filter(pk=2).update(

id=4, # 沒有級聯更新,報錯!!

)

django 之 ORM操作多表聯查總結

基於物件查詢 子查詢 按欄位 publish 一對多 book publish book set.all 正向查詢按欄位 查詢python這本書籍的出版社的郵箱 python models.book.objects.filter title python first print python.pub...

django之ORM查詢操作(二)

過濾器 基於所給的引數限制查詢的結果 count 返回當前查詢的總條數 aggregate 聚合 exists 判斷查詢集中是否有資料,如果有則返回true,沒有則返回false 2.快取 查詢集的結果被存下來之後,再次查詢相同資料時會使用之前快取的資料 user列表資訊檢視 def userlis...

Django資料之ORM外來鍵操作

如果公共關鍵字在乙個關係中是主關鍵字,那麼這個公共關鍵字被稱為另乙個關係的外來鍵。建立外來鍵 表一 class foo models.model name models.charfield max length 1 表二class business models.model id caption m...