055:ORM外键使用详解

外键:
在 MySQL 中,表有两种引擎,一种是 InnoDB ,另外一种是 myisam 。如果使用的是 InnoDB 引擎,是支持外键约束的。外键的存在使得 ORM 框架在处理表关系的时候异常的强大。因此这里我们首先来介绍下外键在 Django 中的使用。

类定义为 class ForeignKey(to,on_delete,**options) 。第一个参数是引用的是哪个模型,第二个参数是在使用外键引用的模型数据被删除了,这个字段该如何处理,比如有 CASCADE 、 SET_NULL 等。这里以一个实际案例来说明。比如有一个 User 和一个 Article 两
个模型。一个 User 可以发表多篇文章,一个 Article 只能有一个 Author ,并且通过外键进行引用。那么相关的示例代码如下:

class Category(models.Model):
    username = models.CharField(max_length=128)

class Article(models.Model):
    title = models.CharField(max_length=128)
    content = models.TextField()
    category = models.ForeignKey("Category", on_delete=models.CASCADE)

以上使用 ForeignKey 来定义模型之间的关系。即在 article 的实例中可以通过 author 属性来操作对应的 User 模型。这样使用起来非常的方便。示例代码如下:

def index(request):
    category = Category(username="张三")
    category.save()

    article = Article(title=‘fuck‘, content=‘fuck me‘)
    article.category = category
    article.save()
  print(article.category.username)  article.category.username = ‘李四‘  print(article.category.username)
  return HttpResponse(‘success‘)

为什么使用了 ForeignKey 后,就能通过 author 访问到对应的 user 对象呢。因此在底层, Django 为 Article 表添加了一个 属性名_id 的字段(比如author的字段名称是author_id),这个字段是一个外键,记录着对应的作者的主键。以后通过 article.author 访问的时候,实际上是先通过 author_id 找到对应的数据,然后再提取 User 表中的这条数据,形成一个模型。

如果想要引用另外一个 app 的模型,那么应该在传递 to 参数的时候,使用 app.model_name 进行指定。以上例为例,如果 User 和 Article 不是在同一个 app 中,那么在引用的时候的示例代码如下:

class Article(models.Model):
    title = models.CharField(max_length=128)
    content = models.TextField()
    category = models.ForeignKey("Category", on_delete=models.CASCADE)
    user = models.ForeignKey(‘cms.user‘,on_delete=models.CASCADE, null=True)    # 对应app模型下面的表

如果模型的外键引用的是本身自己这个模型,那么 to 参数可以为 ‘self‘ ,或者是这个模型的名字。在论坛开发中,一般评论都可以进行二级评论,即可以针对另外一个评论进行评论,那么在定义模型的时候就需要使用外键来引用自身。示例代码如下:

class comment(models.Model):
    content = models.TextField()
    origin_comment = models.ForeignKey(‘self‘, on_delete=models.CASCADE)
    # 或
    # origin_comment = models.ForeignKey(‘comment‘, on_delete=models.CASCADE)

相关工程截图:

原文地址:https://www.cnblogs.com/zheng-weimin/p/10225278.html

时间: 2024-08-01 10:27:34

055:ORM外键使用详解的相关文章

mysql--外键(froeign key)-----------MySQL外键使用详解

如果一个实体的某个字段指向另一个实体的主键,就称为外键被指向的实体,称之为主实体(主表),也叫父实体(父表).负责指向的实体,称之为从实体(从表),也叫子实体(子表) 作用:用于约束处于关系内的实体增加子表记录时,是否有与之对应的父表记录 如果主表没有相关的记录,从表不能插入 先插入主表数据后再插入从表数据: 在删除或者更新主表记录时,从表应该如何处理相关的记录 设置级联操作:在主表数据发生改变时,与之关联的从表数据应该如何处理    使用关键字:     on update     on de

SQL的主键和外键约束详解及用途

SQL的主键和外键的作用: 外键取值规则:空值或参照的主键值. (1)插入非空值时,如果主键表中没有这个值,则不能插入. (2)更新时,不能改为主键表中没有的值. (3)删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除. (4)更新主键记录时,同样有级联更新和拒绝执行的选择. 简而言之,SQL的主键和外键就是起约束作用. 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键. 比如: 学生表(学号,姓名,性别,

【Hibernate步步为营】--复合主键映射详解

本题是最基本的分段树操作了.或者一般叫线段树,不过好像和线段没什么关系,只是分段了. 不使用lazy标志,更新只是更新单点. 如果不使用分段树,那么更新时间效率只需要O(1),使用分段树更新效率就需要O(lgn)了. 但是不是用分段树,那么查询的时间效率是O(n),而分段树查询效率是O(lgn) 这就是amortize分摊了时间,而且lgn真的很快,数据不是非常巨大的时候,接近常数了. 故此本题需要使用分段树. #include <cstdio> class EnemyInfo { stati

55.ORM外键:引用同app下的不同模型,引用不同app下的模型,引用模型自身使用详解

外键和表关系 外键是属于数据库级别的,在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam.如果使用的是InnoDB引擎,是支持外键约束的.外键的存在使得ORM框架在处理表关系的时候异常强大.因此这里我们首先来介绍外键在Django中的使用. 类定义为 class ForeignKey(to,on_delete,**options).第一个参数to是应用的哪个模型(也就是应用的表),第二个参数on_delete在使用外键应用的模型数据被删除了,这个字段该如何处理.举例说明,如

056:ORM外键删除操作详解

外键删除操作: 如果一个模型使用了外键.那么在对方那个模型被删掉后,该进行什么样的操作.可以通过 on_delete 来指定.可以指定的类型如下:1.CASCADE :级联操作.如果外键对应的那条数据被删除了,那么这条数据也会被删除.2.PROTECT :受保护.即只要这条数据引用了外键的那条数据,那么就不能删除外键的那条数据.3.SET_NULL:设置为空.如果外键的那条数据被删除了,那么在本条数据上就将这个字段设置为空.如果设置这个选项,前提是要指定这个字段可以为空.4.SET_DEFAUL

ORM外键关联

#coding=utf-8 from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String,DATE,ForeignKey from sqlalchemy.orm import sessionmaker,relationship engine = create_engine("mys

python django中的orm外键级联删除

今天添加了一个路由表,路由表做外键,然后添加了几个组,路由表为组的外键,当我使用删除功能对路由表进行删除时,竞然将我的组也相当的删除了:尽管这是测试,但放到生产环境中还是会发生意外的:这个问题要解决: 在网上查了一下资料,问题主要是django orm的field字段有关: routemgr = models.ForeignKey('Routemgr',default=1,blank=True,null=True,on_delete=models.SET_NULL) 主要意思就是把Routemg

Django中ORM外键和表的关系(Django编程-4)

外键 在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam.如果使用的是InnoDB引擎,是支持外键约束的.外键的存在使得ORM框架在处理表关系的时候异常的强大.因此这里我们首先来介绍下外键在Django中的使用. 类定义为class ForeignKey(to,on_delete,**options).第一个参数是引用的是哪个模型,第二个参数是在使用外键引用的模型数据被删除了,这个字段该如何处理,比如有CASCADE.SET_NULL等.这里以一个实际案例来说明.比如有一个

Django学习手册 - ORM 外键

Django 外键操作 关键语法: models.ForeignKey("UserGroup",to_field="gid",default=1,on_delete=models.CASCADE) 参数: "UserGroup"  #外键另外一张表 to_field="gid" #另外一张表的字段 on_delete=models.CASCADE  #因为不加这个会报错相关(https://www.cnblogs.com/ph