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='小花') # 创建wife对象
>>> w.save() # 保存到数据库
>>>
>>> h = Hsband(name='老王', wife=w) # 创建hsband对象
>>> h.save() # 保存到数据库
>>>
>>> h.wife.name # 一对一关系直接访问关系对象,看一下老王h 的妻子的名字
>>> '小花'
>>> w.hsband.name # 看一下小花的丈夫
>>> '老王'
ForeignKey 一对多关系
多对多关系,数据库中两张表通过外键约束,多的一方添加外键。举例:一个作者可以有多篇文章,文章外键对应作者。这是一个典型的一对多案例。
使用例子:
from django.db import models
# 创建作者模型
class Author(models.Model):
name =models.CharField(max_length=20)
# 创建文章模型
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 环境操作:
>>> 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)
>>> '一班'
>>> '二班'
>>>