【Django入门】——模型类的关联关系简介

文章目录

  • 1. 多对多
  • 2. 一对一

在【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)

你可能感兴趣的:(#,Django框架)