Django ORM 一對多 和 多對多

2022-03-17 12:25:21 字數 4167 閱讀 8157

在 models.py 上定義:

class province(models.model):

name = models.charfield(max_length=32)

def __str__(self):

return self.name

class city(models.model):

name = models.charfield(max_length=32)

pro = models.foreignkey("province", to_field='id', on_delete=models.cascade)

def __str__(self):

return self.name

執行語句生成資料庫

python manage.py makemigrations

python manage.py migrate

修改 urls.py 新增乙個url

path('test.html', views.test),
在 views.py 上新增

def test(req):

# 新增資料

# models.province.objects.create(name='河北')

# models.province.objects.create(name='廣東')

# models.province.objects.create(name='山東')

# models.city.objects.create(name='東莞', pro_id=2)

# models.city.objects.create(name='深圳', pro_id=2)

# models.city.objects.create(name='惠州', pro_id=2)

# models.city.objects.create(name='河源', pro_id=2)

# models.city.objects.create(name='泰安', pro_id=3)

# models.city.objects.create(name='青島', pro_id=3)

# models.city.objects.create(name='濟南', pro_id=3)

# models.city.objects.create(name='張家口', pro_id=1)

# models.city.objects.create(name='邢台', pro_id=1)

# 正向查詢(具有外來鍵字段的)

v = models.city.objects.values('id', 'pro__city', 'pro__city__name', 'pro__name')

print(v)

# 擷取一部分結果: ......

# 反向查詢

l = models.province.objects.values('id', 'name', 'city__name')

print(l)

# 擷取一部分結果: , ....

# 獲取 province 所有的值

pro_list = models.province.objects.all()

print(pro_list)

# 結果:

# 獲取所有 省份 並且 城市id 都小於5的值

for item in pro_list:

print(item.id, item.name, item.city_set.filter(id__lt=5))

# 獲取第乙個省份和其所有的城市

print(pro_list[0])

print(pro_list[0].city_set.all())

# 結果:

# 河北

在 models.py 上定義:

class book(models.model):

name = models.charfield(max_length=32)

class author(models.model):

name = models.charfield(max_length=32)

m = models.manytomanyfield('book')

執行語句生成資料庫

python manage.py makemigrations

python manage.py migrate

在 views.py 上新增

def test(req):

# 正向查詢,獲取 author id 為1 的所有著作

obj = models.author.objects.get(id=1)

l = obj.m.all()

for item in l:

print(item.id, item.name)

# 反向查詢,獲取 著作為 1 的作者

插入資料

執行結果:

新增資料,進行查詢操作

修改 views.py

# 或者作者和其對應的所有著作

# 通過第三張表 m 來查詢資料

author_list = models.author.objects.values('id', 'name', 'm', 'm__name')

for item in author_list:

print(item['id'], item['name'], '書籍id:', item['m'], item['m__name'])

第三張表中新增乙個對應關係

# 增加

obj = models.author.objects.get(id=1)

obj.m.add(5)

obj.m.add(4, 5)

obj.m.add(*[4, 5])

# 刪除

obj.m.remove(5)

obj.m.remove(4, 5)

obj.m.remove(*[4, 5])

# 清空

obj.m.clear()

# 更新

obj.m.set([1, 2, 3])

# 新增

obj = models.book.objects.get(id=1)

obj.author_set.add(1)

obj.author_set.add(1, 2, 3, 4)

Django ORM 一對多操作

models.py form django.db import models class book models.model 表名book,django會自動使用專案名 我們定義的表名 如沒有自定義主鍵,django會自動新增乙個主鍵,欄位名id 自增 name models.charfield m...

hibernate單向一對多和雙向一對多

單向一對多 例如有部門封裝類 private int deptno private string deptname private string location 有職員封裝類 private int empno private string empname private dept dept 在多...

MySQL關係 一對多 一對一 多對多

將實體與實體的關係,反應到最終資料庫表的設計上,將關係分為三種 一對一,一對多 多對一 和多對多,所有的關係都是表與表之間的關係 一對一 一對一 一張表的一條記錄只能與另外一條記錄進行對應,反之亦然 id p 姓名 性別 年齡 身高 婚姻狀況 籍貫 家庭位址 緊急聯絡人 體重 表設計成以上這種形式 ...