django中的主表和从表

一、主表和从表

在 Django 中,ORM 的关系模型中,有主表和从表之分。其中,主表又称为“一方表”,从表也称为“多方表”。这里举个简单的例子:假设有两个模型 Blog 和 Entry,每个 Blog 包含多个 Entry

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

class Entry(models.Model):
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
    headline = models.CharField(max_length=255)
    body_text = models.TextField()
    pub_date = models.DateTimeField()
    mod_date = models.DateTimeField()
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

在上述代码中,Blog 是主表,Entry 是从表。

主要有以下几点需要注意:

  1. 多方表需要定义一个外键关联到一方表,以明确两者间的关系,上述代码中 Entry 模型中 blog 字段就是一个外键;
  2. 一方表对象可以通过外键字段名字访问到其从表中的所有对象,比如 blog.entry_set.all() 就可以获取到指定 blog 下的所有 Entry 对象;
  3. 在使用 ForeignKey 定义外键时,必须指定 on_delete 参数,表示当该外键关联的主键被删除时,从表中的相关记录的处理方式。

以上只是简单地介绍了 Django ORM 中的主表和从表以及外键的用法,实际情况下,还涉及到表和字段的命名约定、级联操作等等问题。

 

二、外键关联

在 Django 中,外键关联到其他模型时,需要指定 ForeignKey 字段的 on_delete 属性,该属性表示当关联的对象被删除时,该如何处理外键值。on_delete 的值是一个字符串,可选的值如下:

都将被删除。这通常是最常见的行为。

PROTECT:防止执行外键关联的对象被删除。如果试图删除外键对象,Django 将引发 ProtectedError。

SET_NULL:将外键的值设置为 NULL,并且只有当关联对象的 null=True 时才能使用。这意味着当外键关联的对象被删除时,外键上的值将不再引用任何对象。

SET_DEFAULT:将外键的值设置为 默认值,并且只有当关联对象的 default 参数设置时才能使用。当关联对象被删除时,Django 会尝试使用关联模型的 default 值来替换当前外键。

SET():将外键的值设置为指定的值,并且只有当关联对象的 null=True 或 default 参数设置时才能使用,SET() 需要传入一个可调用对象,来计算新外键的值。

DO_NOTHING:什么都不做。在这种情况下,如果尝试删除外键关联的对象,这个操作将会引发完整性错误,并且数据库行为将会定义在数据库引擎级。这可能会导致 Django 的行为与数据库期望的行为不同,这可能会产生潜在的问题。

总之,使用 on_delete 是很重要的,因为它可以避免遗留数据。每个 Django 项目都可能需要不同的行为,所以必须根据项目的需求选择适当的行为。

 

posted on 2023-04-24 18:53  一先生94  阅读(140)  评论(0编辑  收藏  举报

导航