摘要
外键约束删掉后,另一方实体模型被删除时,要根据on_delete来特定实际操作。比如CASCADE,就是联级实际操作,删除外键约束相匹配的数据信息时,也会删掉这条数据信息。PROTECT则是受维护,只要有数据信息引入了外键约束,就不能删除。
正文
Django(15)外键约束和表关联
外键约束删掉实际操作
假如一个实体模型应用了外键约束。那麼在另一方那一个实体模型被删除后,该开展哪些的实际操作。能够 根据on_delete
来特定。能够 特定的种类以下:
- CASCADE:联级实际操作。假如外键约束相匹配的哪条数据信息被删除了,那麼这条数据信息也会被删掉。
- PROTECT:受维护。即只需这条数据信息引入了外键约束的哪条数据信息,那麼就不可以删掉外键约束的哪条数据信息。
- SET_NULL:设定为空。假如外键约束的哪条数据信息被删除了,那麼在真奈美数据信息上就将这一字段名设定为空。假如设定这一选择项,
前提条件是要特定这一字段名能够 为空
。 - SET_DEFAULT:设定初始值。假如外键约束的哪条数据信息被删除了,那麼真奈美数据信息上就将这一字段名设定为初始值。假如设定这一选择项,前提条件是要特定这一字段名一个初始值。
- SET():假如外键约束的哪条数据信息被删除了。那麼可能获得SET涵数中的值来做为这一外键约束的值。SET涵数能够 接受一个能够 启用的目标(例如涵数或是方式 ),如果是能够 启用的目标,那麼会将这一目标启用后的結果做为值回到回来。
- DO_NOTHING:不采取任何个人行为。一切就看数据库查询等级的管束。
留意:之上这种选择项仅仅Django等级
的,数据信息等级依然是RESTRICT
!
表关联
表中间的关联全是根据外键约束来开展关系的。而表中间的关联,只不过便是三种关联:一对一、一对多、多对多等。下列将讨论一下三种关联的应用领域以及完成方法。
一对多
应用领域:例如文章内容和创作者中间的关联。一个文章内容只有由一个创作者撰写,可是一个创作者能够 写数篇文章内容。文章内容和创作者中间的关联便是典型性的多对一的关联
完成方法:一对多,全是根据ForeignKey
来完成的。
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)
那麼之后在给Article
目标特定category
,就可以应用下列编码来进行:
article = Article(title='abc',content='123')
author = User(username='jkc',password='123456')
# 要先储存到数据库查询中
author.save()
article.author = author
article.save()
而且之后假如要想获得某一类型下全部的文章内容,能够 根据article_set
来完成。实例编码以下:
user = User.objects.first()
# 获得第一个客户写的全部文章内容
articles = user.article_set.all()
for article in articles:
print(article)
一对一
- 在Django中一对一是根据
models.OnetToOneField
来完成的。这一OneToOneField
实际上实质上便是一个外键约束,只不过是这一外键约束有一个唯一管束(unique key)
,来完成一对一。 - 之后假如要想反方向引入,那麼是根据引入的实体模型的名称变换为小写字母的方式开展浏览。例如下列实体模型:
class FrontUser(models.Model):
username = models.CharField(max_length=200)
class UserExtension(models.Model):
school = models.CharField(max_length=100)
user = models.OneToOneField("FrontUser",on_delete=models.CASCADE)
# 根据userextension来浏览UserExtension目标
user = FrontUser.objects.first()
print(user.userextension)
UserExtension
的目标,能够 根据user来浏览到相匹配的user目标。而且FrontUser
目标能够 应用userextension
来浏览相匹配的UserExtension
目标。 假如不愿应用Django默认设置的引入特性名称。那麼能够 在OneToOneField
中加上一个related_name
主要参数。实例编码以下:
class FrontUser(models.Model):
username = models.CharField(max_length=200)
class UserExtension(models.Model):
school = models.CharField(max_length=100)
user = models.OneToOneField("FrontUser",on_delete=models.CASCADE,related_name='extension')
# 根据extension来浏览到UserExtension目标
user = FrontUser.objects.first()
print(user.extension)
那麼之后就FrontUser
的目标就可以根据extension
特性来浏览到相匹配的UserExtension
目标。
多对多
- 应用领域:例如文章内容和标识的关联。一篇文章能够 有好几个标识,一个标识能够 被好几个文章内容所引入。因而标识和文章内容的关联是典型性的多对多的关联。
- 完成方法:Django为这类多对多的完成给予了专业的Field。称为
ManyToManyField
。或是拿文章内容和标识为例子开展解读。实例编码以下:
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
tags = models.ManyToManyField("Tag",related_name="articles")
class Tag(models.Model):
name = models.CharField(max_length=50)
在数据库查询方面,事实上Django是为这类多对多的关联创建了一个正中间表。这一正中间表各自界定了2个外键约束,引入到article
和tag
二张表的外键约束。
在大家应用多对多反方向引入加上的情况下,只有应用add
这类加上方法,例如向文章内容中加上标识,实例编码以下:
article = Article.objects.first()
tag = Tag(name="漂亮")
tag.save()
article.tag_set.add(tag) # 向文章内容中加上标识tag
关注不迷路
扫码下方二维码,关注宇凡盒子公众号,免费获取最新技术内幕!
评论0