OneToOneField 一對(duì)一關(guān)系
一對(duì)一就是薇组,兩張表數(shù)據(jù)通過(guò)唯一外鍵約束,舉個(gè)例子:如一個(gè)丈夫只有一個(gè)妻子坐儿。丈夫的外鍵就是妻子律胀,而這個(gè)外鍵是唯一的。
一對(duì)一的使用例子:
from django.db import models
# 妻子的數(shù)據(jù)模型
class Wife(models.Model):
# 名字
name = models.CharField(max_length=20)
# 丈夫的數(shù)據(jù)模型
class Husband(models.Model):
# 名字
name = models.CharField(max_length=20)
# 定義一對(duì)一關(guān)系
wife = models.OneToOne(Wife)
在django shell中測(cè)試:
>>> from demo.models import Wife, Husband
>>>
>>> w = Wife(name='小花') # 創(chuàng)建wife對(duì)象
>>> w.save() # 保存到數(shù)據(jù)庫(kù)
>>>
>>> h = Hsband(name='老王', wife=w) # 創(chuàng)建hsband對(duì)象
>>> h.save() # 保存到數(shù)據(jù)庫(kù)
>>>
>>> h.wife.name # 一對(duì)一關(guān)系直接訪問(wèn)關(guān)系對(duì)象貌矿,看一下老王h 的妻子的名字
>>> '小花'
>>> w.hsband.name # 看一下小花的丈夫
>>> '老王'
ForeignKey 一對(duì)多關(guān)系
多對(duì)多關(guān)系炭菌,數(shù)據(jù)庫(kù)中兩張表通過(guò)外鍵約束,多的一方添加外鍵逛漫。舉例:一個(gè)作者可以有多篇文章黑低,文章外鍵對(duì)應(yīng)作者。這是一個(gè)典型的一對(duì)多案例酌毡。
使用例子:
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)
# 一對(duì)多 一個(gè)作者對(duì)應(yīng)多本書
# on_delete = models.CASCADE 當(dāng)作者被刪除對(duì)應(yīng)的BOOK也會(huì)刪除
author = models.ForeignKey(Author, on_delete=models.CASCADE)
django shell 測(cè)試:
>>> from medo.models import Author, Book
>>>
>>> a = Author(name='天蠶') # 作者
>>> a.save()
>>> b1 = Book(name='大主宰', author=a)
>>> b1.save()
>>> b2 = Book(name='舞動(dòng)', author=a)
>>> b2.save()
>>>
>>> books = a.book_set.all() # 查詢a作者的所有書
>>> for book in books: # 遍歷拿到單本書對(duì)象投储,打印書名
...print(book.name)
>>> '大主宰'
>>> '舞動(dòng)'
>>>
>>> b1.author.name # 直接通過(guò)書查詢作者
>>> '天蠶'
ManyToManyField多對(duì)多
多對(duì)多通過(guò)數(shù)據(jù)庫(kù)的第三張表將對(duì)應(yīng)的其他兩張表的主鍵聯(lián)系在一起第练。多對(duì)多的舉例,如一個(gè)老師可以教多個(gè)班級(jí)玛荞,一個(gè)班級(jí)可以有多個(gè)老師娇掏。
使用例子:
from django.db import models
# 定義老師模型
class Teacher(models.Model):
name = models.CharField(max_length=20)
# 定義班級(jí)模型
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='一班') # 班級(jí) 定義時(shí)先不要添加 約束對(duì)象
>>> c2 = Class(name='二班')
>>> c1.save()
>>> c2.save()
>>> c1.teachers.add(t1) # 往一班添加一個(gè)老師 t1
>>> c1.teachers.add(t2) # 再次添加老師 t2
>>>
>>> c2.teachers.add(t1) # 往二班添加一個(gè)老師 t1
>>> c2.teachers.add(t2) # 往二班添加一個(gè)老師 t2
>>> c2.teachers.add(t3) # 往二班添加一個(gè)老師 t3
>>>
>>> c2t = c2.teachers.all() # 查詢c2班的所有老師
>>> for t in c2t: # 遍歷打印
... print(t.name)
>>> '老王'
>>> '老劉'
>>> '老郭'
>>>
>>> cls = t1.class_set.all() # 老王的班級(jí)
>>> for c in cls:
... print(c.name)
>>> '一班'
>>> '二班'
>>>