美文网首页我用 LinuxLinux
django中ORM外键和表的关系-上

django中ORM外键和表的关系-上

作者: 小短腿电工 | 来源:发表于2019-03-05 19:51 被阅读1次

外键和表关系

外键:

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

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

class User(models.Model):
    username = models.CharField(max_length=20)
    password = models.CharField(max_length=100)

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

    author = models.ForeignKey("User",on_delete=models.CASCADE)

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

article = Article(title='abc',content='123')
author = User(username='张三',password='111111')
article.author = author
article.save()

# 修改article.author上的值
article.author.username = '李四'
article.save()

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

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

# User模型在user这个app中
class User(models.Model):
    username = models.CharField(max_length=20)
    password = models.CharField(max_length=100)

# Article模型在article这个app中
class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

    author = models.ForeignKey("user.User",on_delete=models.CASCADE)

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

class Comment(models.Model):
    content = models.TextField()
    origin_comment = models.ForeignKey('self',on_delete=models.CASCADE,null=True)
    # 或者
    # origin_comment = models.ForeignKey('Comment',on_delete=models.CASCADE,null=True)

外键删除操作:

如果一个模型使用了外键。那么在对方那个模型被删掉后,该进行什么样的操作。可以通过on_delete来指定。可以指定的类型如下:

  1. CASCADE:级联操作。如果外键对应的那条数据被删除了,那么这条数据也会被删除。
  2. PROTECT:受保护。即只要这条数据引用了外键的那条数据,那么就不能删除外键的那条数据。
  3. SET_NULL:设置为空。如果外键的那条数据被删除了,那么在本条数据上就将这个字段设置为空。如果设置这个选项,前提是要指定这个字段可以为空。
  4. SET_DEFAULT:设置默认值。如果外键的那条数据被删除了,那么本条数据上就将这个字段设置为默认值。如果设置这个选项,前提是要指定这个字段一个默认值。
  5. SET():如果外键的那条数据被删除了。那么将会获取SET函数中的值来作为这个外键的值。SET函数可以接收一个可以调用的对象(比如函数或者方法),如果是可以调用的对象,那么会将这个对象调用后的结果作为值返回回去。
  6. DO_NOTHING:不采取任何行为。一切全看数据库级别的约束。

以上这些选项只是Django级别的,数据级别依旧是RESTRICT!


相关文章

  • django中ORM外键和表的关系-上

    外键和表关系 外键: 在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam。如果使用的是Inn...

  • Django - ORM外键

    表和表之间可以存在关系,最多的是一对多的关系。外键字段: 示例: 注意:虽然models.py类中是属性user_...

  • Django模型(三)

    知识要点: 表关系的实现 一对多表关系 在Mysql中一对多是通过外键实现的,在django模型中通过Foreig...

  • Django模型中有外键关系的表删除相关设置

    django模型中有外键关系的表删除相关设置 一.一对一 例如有Author、AuthorDetail两表 1)关...

  • 4.4 django 模型外键和表关系

    外键和表关系 外键: 在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam。如果使用的是Inn...

  • SpringData分析

    学习ORM思想启发 1 建立实体类与表中的关系 2 建立实体类中属性和表中字段关系 学习ORM思想 2.1 orm...

  • django 2.0外键处理

    Django2.0里model外键和一对一的on_delete参数 在django2.0后,定义外键和一对一关系的...

  • Django之路(二)- ORM,生命周期

    ORM 关系对象映射(Object Relational Mapping,简称ORM),django中遵循 Cod...

  • Flask_Sqlalchemy

    外键 例子1 关系型数据库使用关系把不同表中的行联系起来。 如图上例所示,关系使用 users 表中的外键连接了两...

  • sqlserver 2008 r2 主外键建立

    1。右键要建立的外检列字段,2.选择关系 外键表就是要建外键的表, 主键表是因为外键在另一个表上是主键。所以叫做主键表

网友评论

    本文标题:django中ORM外键和表的关系-上

    本文链接:https://www.haomeiwen.com/subject/isxauqtx.html