在【Django入门】——Django中通过模型类实现数据表基本操作中,我们提到了通过模型类创建的数据表之间会具有一对多关系。
实际上,这些数据表之间还有多对多和一对一的关系:
1. 多对多
例如,在实际中,假设有一个新闻类以及一个新闻类型类。我们知道一篇新闻可以是体育新闻类型,也可以是国际新闻,还可以既是体育新闻也是国际新闻;反之,体育新闻类型或国际新闻分类下,都可以有多篇新闻。
如果想要指定通过模型类创建的数据表之间存在多对多这样的关系,可以在定义模型类时使用models.ManyToManyField()
来定义一个类属性,而该类属性无论定义在新闻类还是新闻类型类都可以。例如:
# 新闻类型类
class NewsType(models.Model):
# 新闻类型名称
type_name = models.CharField(max_length=20)
# 关系属性,代表类型下面各篇新闻
# news = models.ManyToManyField('News')
# 新闻类
class News(models.Model):
# 新闻标题
title = models.CharField(max_length=20)
# 发布时间
pub_date = models.DateTimeField(auto_now_add=True) # 以当前时间作为新闻的出版时间
# 新闻内容
content = models.TextField()
# 关系属性,代表新闻所属的类型
new_type = models.ManyToManyField('NewsType')
2. 一对一
例如,在实际中,假设有一个员工基本信息类和一个员工详细信息类,则通过这两个模型类创建的数据表,其中一个数据表中的数据和另一个数据表中的数据是一一对应的。
如果想要指定通过模型类创建的数据表之间存在一对一的关系,可以在定义模型类时使用models.OneToOneField()
来定义一个类属性。同样地,该类属性可以定义在员工基本信息类或员工详细信息类。例如:
# 员工基本信息类
class EmployeeBasicInfo(models.Model):
# 员工姓名
name = models.CharField(max_length=20)
# 员工性别
gender = models.BooleanField(default=False)
# 员工年龄
age = models.IntegerField()
# 员工详细信息类
class EmployeeDetailedInfo(models.Model):
# 联系地址
address = models.CharField(max_length=256)
# 关系属性,代表员工基本信息
employee_basic_info = models.OneToOneField('EmployeeBasicInfo', models.CASCADE)