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
是从表。
主要有以下几点需要注意:
- 多方表需要定义一个外键关联到一方表,以明确两者间的关系,上述代码中
Entry
模型中blog
字段就是一个外键; - 一方表对象可以通过外键字段名字访问到其从表中的所有对象,比如
blog.entry_set.all()
就可以获取到指定blog
下的所有Entry
对象; - 在使用
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 项目都可能需要不同的行为,所以必须根据项目的需求选择适当的行为。