Django-外键

[复制链接]
发表于 2026-2-10 23:54:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
Django-外键

在Django中,可以使用外键(ForeignKey)来创建两个模子之间的关联关系。在界说一个模子时,可以使用ForeignKey字段来引用另一个模子,从而创建外键关系。
比方,以下是一个简朴的示例,展示了怎样在Django模子中使用外键:
  1. from django.db import models
  2. class Author(models.Model):
  3.    name = models.CharField(max_length=100)
  4. class Book(models.Model):
  5.    title = models.CharField(max_length=200)
  6.    author = models.ForeignKey(Author, on_delete=models.CASCADE)
复制代码
在上面的示例中,Book模子中的author字段是一个外键,它引用了Author模子。这意味着每本书都必须关联到一个作者,这种关系称为一对多关系(One-to-Many relationship)。
当你使用外键时,必要指定on_delete选项,以界说当引用的对象被删除时应该怎样处置惩罚外键关联。常用的选项包罗:

  •         models.CASCADE:级联删除,即当引用的对象被删除时,与之干系的对象也会被删除。
  •         models.PROTECT:掩护模式,即当引用的对象被删除时,会抛出ProtectedError非常,克制删除使用。
  •         models.SET_NULL:设置为NULL,即当引用的对象被删除时,外键字段会被设置为NULL。
  •         models.SET_DEFAULT:设置为默认值,即当引用的对象被删除时,外键字段会被设置为默认值。
  •         models.SET():设置为指定值,可以自界说设置外键字段的值。
通过使用外键,可以轻松地在Django中创建模子之间的关联关系,实现数据之间的毗连和查询。
Django-多对多关系

在Django中,可以使用多对多(Many-to-Many)关系来创建两个模子之间的多对多关联关系。当两个模子之间存在多对多关系时,必要使用ManyToManyField字段来界说这种关系。
以下是一个简朴的示例,展示了怎样在Django模子中使用多对多关系:
  1. from django.db import models
  2. class Student(models.Model):
  3.    name = models.CharField(max_length=100)
  4. class Course(models.Model):
  5.    name = models.CharField(max_length=100)
  6.    students = models.ManyToManyField(Student)
复制代码
在上面的示例中,Course模子中的students字段是一个多对多字段,它体现一个课程可以有多名门生,而一名门生也可以选择多门课程。这种关系称为多对多关系(Many-to-Many relationship)。
当界说多对多关系时,Django会自动创建一个中央表来生存两个模子之间的关联数据,你可以通过中央表来访问和管理多对多关系。
比方,你可以通过以下方式来添加门生到课程中:
  1. # 获取要添加的学生对象和课程对象
  2. student = Student.objects.get(name='Alice')
  3. course = Course.objects.get(name='Math')
  4. # 将学生添加到课程中
  5. course.students.add(student)
复制代码
通过使用多对多关系,可以在Django中轻松地创建多对多关联关系,实现复杂的数据结构和查询需求。
当使用多对多关系时,除了在模子中界说ManyToManyField字段之外,还可以通过中央表来自界说多对多关系的属性,比方添加额外的字段大概方法。
下面是一个示例,展示了怎样通过自界说中央表来扩展多对多关系:
  1. from django.db import models
  2. class Student(models.Model):
  3.    name = models.CharField(max_length=100)
  4. class Course(models.Model):
  5.    name = models.CharField(max_length=100)
  6.    students = models.ManyToManyField(Student, through='Enrollment')
  7. class Enrollment(models.Model):
  8.    student = models.ForeignKey(Student, on_delete=models.CASCADE)
  9.    course = models.ForeignKey(Course, on_delete=models.CASCADE)
  10.    date_enrolled = models.DateField()
复制代码
在上面的示例中,我们界说了一个名为Enrollment的中央模子,用于管理Student和Course之间的多对多关系。这个中央模子包罗了额外的字段date_enrolled,用来纪录门生注册课程的日期。
通过自界说中央表,你可以更机动地管理多对多关系的属性和举动,满意更复杂的业务需求。固然,如果只是简朴地创建多对多关系,直接使用ManyToManyField字段就富足了。
Django-中央模子

在Django中,通过设置through参数来指定一个中央模子(intermediate model),用于自界说多对多关系的举动和属性。在上面的示例中,通过设置through='Enrollment',我们告诉Django在Course模子和Student模子之间的多对多关系必要使用Enrollment作为中央模子。
具体来说,through='Enrollment'的作用包罗:

  •         自界说多对多关系的中央表:通过指定through参数,我们可以显式地指定一个中央模子来管理多对多关系,而不是让Django自动天生默认的中央表。如许可以更加机动地控制多对多关系的举动。
  •         添加额外的字段或属性:在中央模子中,我们可以界说额外的字段或属性,比方date_enrolled字段,用来纪录门生注册课程的日期。如许可以为多对多关系添加更多的信息。
  •         定制多对多关系的举动:通过中央模子,我们可以实现一些自界说的逻辑或方法,比方盘算门生在课程中的效果、纪录门生的加入环境等。如许可以在多对多关系中实现更多的业务逻辑。
总之,通过设置through参数并指定一个中央模子,我们可以更加机动地控制和定制多对多关系,在满意复杂业务需求的同时保持数据结构的清楚性和可维护性。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表