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)
>>> '一班'
>>> '二班'
>>>