django 3種數據關系的使用

OneToOneField 一對一關系

一對一就是,兩張表數據通過唯一外鍵約束,舉個例子:如一個丈夫只有一個妻子。丈夫的外鍵就是妻子,而這個外鍵是唯一的。
一對一的使用例子:

from django.db import models


# 妻子的數據模型
class Wife(models.Model):
 # 名字
 name = models.CharField(max_length=20)


# 丈夫的數據模型
class Husband(models.Model):
 # 名字
 name = models.CharField(max_length=20)
 # 定義一對一關系
 wife = models.OneToOne(Wife)

在django shell中測試:

>>> from demo.models import Wife, Husband
>>> 
>>> w = Wife(name='小花')   # 創(chuàng)建wife對象
>>> w.save()  # 保存到數據庫
>>>
>>> h = Hsband(name='老王', wife=w)  # 創(chuàng)建hsband對象
>>> h.save()  # 保存到數據庫
>>>
>>> h.wife.name  # 一對一關系直接訪問關系對象,看一下老王h 的妻子的名字 
>>> '小花'
>>> w.hsband.name  # 看一下小花的丈夫
>>> '老王'

ForeignKey 一對多關系

多對多關系,數據庫中兩張表通過外鍵約束,多的一方添加外鍵。舉例:一個作者可以有多篇文章,文章外鍵對應作者。這是一個典型的一對多案例。
使用例子:

from django.db import models


# 創(chuàng)建作者模型
class Author(models.Model):
  name =models.CharField(max_length=20)


# 創(chuàng)建文章模型
class Book(models.Model):
  # 名字
  name = models.CharField(max_length=20)
  # 一對多 一個作者對應多本書
  # on_delete = models.CASCADE 當作者被刪除對應的BOOK也會刪除
  author = models.ForeignKey(Author, on_delete=models.CASCADE)

django shell 測試:

>>> from medo.models import Author, Book
>>>
>>> a = Author(name='天蠶')  # 作者
>>> a.save()
>>> b1 = Book(name='大主宰', author=a) 
>>> b1.save()
>>> b2 = Book(name='舞動', author=a)
>>> b2.save()
>>> 
>>> books = a.book_set.all()  # 查詢a作者的所有書
>>> for book in books:  # 遍歷拿到單本書對象,打印書名
...print(book.name)
>>> '大主宰'
>>> '舞動'
>>> 
>>> b1.author.name  # 直接通過書查詢作者
>>> '天蠶'

ManyToManyField多對多

多對多通過數據庫的第三張表將對應的其他兩張表的主鍵聯系在一起。多對多的舉例,如一個老師可以教多個班級,一個班級可以有多個老師。
使用例子:

from django.db import models


# 定義老師模型
class Teacher(models.Model):
  name = models.CharField(max_length=20)
  
# 定義班級模型
class Class(models.Model):
  name = models.CharField(max_length=20)
  teachers = models.ManyToManyField(Teacher)

shell 環(huán)境操作:

>>> from medo.models import Teacher, Class
>>>
>>> t1 = Teacher(name='老王')  # 老師
>>> t2 = Teacher(name='老郭')
>>> t3 = Teacher(name='老劉')
>>>
>>> t1.save()
>>> t2.save()
>>> t3.save()
>>>
>>> c1 = Class(name='一班')  # 班級 定義時先不要添加 約束對象
>>> c2 = Class(name='二班')
>>> c1.save()
>>> c2.save()
>>> c1.teachers.add(t1)  # 往一班添加一個老師 t1
>>> c1.teachers.add(t2)  # 再次添加老師 t2  
>>>
>>> c2.teachers.add(t1)  # 往二班添加一個老師 t1
>>> c2.teachers.add(t2)  # 往二班添加一個老師 t2
>>> c2.teachers.add(t3)  # 往二班添加一個老師 t3
>>> 
>>> c2t = c2.teachers.all()  # 查詢c2班的所有老師
>>> for t in c2t:  # 遍歷打印
... print(t.name)
>>> '老王'
>>> '老劉'
>>> '老郭'
>>> 
>>> cls = t1.class_set.all()  # 老王的班級
>>> for c in cls:
... print(c.name)
>>> '一班'
>>> '二班'
>>>
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容