码迷,mamicode.com
首页 > 其他好文 > 详细

055:ORM外键使用详解

时间:2019-01-05 18:24:34      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:inno   asc   origin   关系   支持   index   isa   return   for   

外键:
在 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)

相关工程截图:

技术分享图片

技术分享图片

 

055:ORM外键使用详解

标签:inno   asc   origin   关系   支持   index   isa   return   for   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!