Django(15)外键约束和表关联

外键约束删掉实际操作

假如一个实体模型应用了外键约束。那麼在另一方那一个实体模型被删除后,该开展哪些的实际操作。能够 根据on_delete来特定。能够 特定的种类以下:

  1. CASCADE:联级实际操作。假如外键约束相匹配的哪条数据信息被删除了,那麼这条数据信息也会被删掉。
  2. PROTECT:受维护。即只需这条数据信息引入了外键约束的哪条数据信息,那麼就不可以删掉外键约束的哪条数据信息。
  3. SET_NULL:设定为空。假如外键约束的哪条数据信息被删除了,那麼在真奈美数据信息上就将这一字段名设定为空。假如设定这一选择项,前提条件是要特定这一字段名能够 为空
  4. SET_DEFAULT:设定初始值。假如外键约束的哪条数据信息被删除了,那麼真奈美数据信息上就将这一字段名设定为初始值。假如设定这一选择项,前提条件是要特定这一字段名一个初始值。
  5. SET():假如外键约束的哪条数据信息被删除了。那麼可能获得SET涵数中的值来做为这一外键约束的值。SET涵数能够 接受一个能够 启用的目标(例如涵数或是方式 ),如果是能够 启用的目标,那麼会将这一目标启用后的結果做为值回到回来。
  6. 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)

 

一对一

  1. 在Django中一对一是根据models.OnetToOneField来完成的。这一OneToOneField实际上实质上便是一个外键约束,只不过是这一外键约束有一个唯一管束(unique key),来完成一对一。
  2. 之后假如要想反方向引入,那麼是根据引入的实体模型的名称变换为小写字母的方式开展浏览。例如下列实体模型:
 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目标。
 

多对多

  1. 应用领域:例如文章内容和标识的关联。一篇文章能够 有好几个标识,一个标识能够 被好几个文章内容所引入。因而标识和文章内容的关联是典型性的多对多的关联。
  2. 完成方法: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个外键约束,引入到articletag二张表的外键约束。
在大家应用多对多反方向引入加上的情况下,只有应用add这类加上方法,例如向文章内容中加上标识,实例编码以下:

article = Article.objects.first()
tag = Tag(name="漂亮")
tag.save()
article.tag_set.add(tag)  # 向文章内容中加上标识tag

 

评论(0条)

刀客源码 游客评论