当前位置: 首页 > news >正文

青海免费网站建设福州百度seo代理

青海免费网站建设,福州百度seo代理,帮人做网站赚多少钱,网站建设好学吗前言 上篇文章讲述了ORM模型当中常用的Field以及Meta配置 这篇文章将讲述ORM模型中的外键以及创建表之间的关系 一、外键 在MySQL中,表有两种引擎,一种是InnoD8,另外一种是myisam。如果使用的是InnoD8引擎,是支持外键约束的。外…

前言

上篇文章讲述了ORM模型当中常用的Field以及Meta配置

这篇文章将讲述ORM模型中的外键以及创建表之间的关系


一、外键

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

新创建一个应用名叫article

创建数据库表

#article应用下的 models.py
from django.db import models#书籍种类
class Types(models.Model):title = models.CharField(max_length=100)#书籍信息(外键连接)
class Book(models.Model):name = models.CharField(max_length=100)author = models.CharField(max_length=64)#种类需要和第一张表外接book_type = models.ForeignKey('Types',on_delete=models.CASCADE)
# Create your models here.

编写路由

#article应用urls.py
from django.urls import path
from . import viewsapp_name = 'article'
urlpatterns = [path('book',views.book,name='book')
]
#database应用下的urls.py
path('article/',include("article.urls"))

 编写视图函数

#article应用下的views.py
from django.http import HttpResponse
from django.shortcuts import render
from article.models import Types,Book
def book(request):Type = Types(title = '历史')Type.save()book = Book(name = '三国演义',author='罗贯中',book_type=Type)book.save()return HttpResponse('创建成功')

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

如果想要引用另外一个 app 的模型作为外键,那么应该在传递 to 参数的时候,使用 app.model_name 进行指定。以上例为例,如果user和Article不是在同一个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.Mode1):content =models.TextField()origin_comment = models.Foreignkey( self',on_delete=models.CASCADE,nu11=True)#或者                                   #origin_comment = models.ForeignKey('comment',on_delete=models.CASCADE,nu11-True)

 二、外键删除操作

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

  1. CASCADE:级联操作。如果外键对应的那条数据被删除了,那么这条数据也会被删除。

  2. PROTECT:受保护。即只要这条数据引用了外键的那条数据,那么就不能删除外键的那条数据。

  3. SET_NULL:设置为空。如果外键的那条数据被删除了,那么在本条数据上就将这个字段设置为空。如果设置这个选项,前提是要指定这个字段可以为空。

  4. SET_DEFAULT:设置默认值。如果外键的那条数据被删除了,那么本条数据上就将这个字段设置为默认值。如果设置这个选项,前提是要指定这个字段一个默认值。

  5. SET():如果外键的那条数据被删除了。那么将会获取 SET函数中的值来作为这个外键的值。SET函数可以接收一个可以调用的对象(比如函数或者方法),如果是可以调用的对象,那么会将这个对象调用后的结果作为值返回回去。

  6. DO_NOTHING:不采取任何行为。一切全看数据库级别的约束。

三、表之间的关系

表之间的关系都是通过外键来进行关联的。而表之间的关系,无非就是三种关系:一对一、一对多(多对一)、多对多等。以下将讨论一下三种关系的应用场景及其实现方式。

1.一对多

 应用场景:比如文章和作者之间的关系。一个文章只能由一个作者编写,但是一个作者可以写多篇文章。文章和作者之间的关系就是典型的多对一的关系。 实现方式:一对多或者多对一,都是通过 Foreignkey来实现的。这里采用作者和文章的案例。

class User(models.Model):username = models.charField(max_1ength=20)password = models.charField(max_1ength=100)
class Article(models.Model):title = models.charField(max_length=100)content=models.TextField()author = models.Foreignkey("user",on_delete=models.CASCADE)

那么以后在给Article对象指定 author,就可以使用以下代码来完成:  

article=Article(title='abc',content='123')
author =User(username='zhiliao',password='111111')
#要先保存到数据库中
author.savearticle.author= author
article.save()

 并且以后如果想要获取某个用户下所有的文章,可以通过article_set 来实现。示例代码如下:

user =User.objects.first()
#获取第一个用户写的所有文章
articles =user.article_set.a11()

2.一对一

应用场景:比如一个用户表和一个用户信息表。在实际网站中,可能需要保存用户的许多信息,但是有些信息是不经常用的。如果把所有信息都存放到一张表中可能会影响查询效率,因此可以把用户的一些不常用的信息存放到另外一张表中我们叫做userExtension。但是用户表user和用户信息表userExtension就是典型的一对一了。 实现方式: Django 为一对一提供了一个专门的 Field叫做oneTooneField来实现一对一操作。示例代码如下:

#article应用下的 models.py
class User(models.Model):username = models.CharField(max_length=20)password = models.IntegerField(max_length=100)class UserExtension(models.Model):birthday = models.DateTimeField()university = models.CharField(max_length=200)user = models.OneToOneField('User', on_delete=models.CASCADE)

3.多对多

应用场景:比如文章和标签的关系。一篇文章可以有多个标签,一个标签可以被多个文章所引用。因此标签和文章的关系是典型的多对多的关系。 实现方式: Django为这种多对多的实现提供了专门的Field。叫做ManyToManyField。还是拿文章和标签为例进行讲解。示例代码如下:

#article应用下的 models.py
class Article(models.Model):title = models.CharField(max_length=100)content = models.TextField()tags = models.ManyToManyField("Tag",related_name='article')class Tag(models.Model):name = models.CharField(max_length=100)

http://www.masaee.cn/news/462.html

相关文章:

  • 网站开发项目的简介郑州网络推广团队
  • 网站如何做分享最近发生的新闻事件
  • 网站设计最好的公司搜索引擎入口google
  • 阳西哪里有做网站杭州关键词优化服务
  • 烟台网站制作互联网营销行业前景
  • 编程网站scratch在线使用四川旅游seo整站优化
  • 注册网址的网站做网站的公司
  • 中国建设网建设通官方网站推特是谁的公司
  • 网站建设是永久使用吗百度手机助手应用商店
  • 独立建站什么意思广告制作
  • 武汉网站营销seo电话网站营销推广有哪些
  • 网站开发信息平台项目总结销售找客户最好的app
  • 网站备案主体是什么深圳百度关键字优化
  • 江门高端网站建设软件开发外包
  • 网站建设维护成本正规网络公司关键词排名优化
  • 有哪些专门做减肥内容的网站百度推广竞价排名
  • 东莞地铁app网站优化排名工具
  • 网站建设 cms 下载个人网站注册平台
  • 织梦蓝色政府网站模板谷歌关键词排名优化
  • 优化网站架构百度推广助手
  • 做中英文网站多少钱加强服务保障满足群众急需ruu7
  • 政府的网站用什么系统做的竞价软件哪个好
  • 制作投票网站怎么优化一个网站
  • 连云港网站制作公司哪家好免费的网站推广软件下载
  • 什么是平面设计 都包括哪些内容网站优化公司收费
  • 莱芜建设局网站东莞seo关键词排名优化排名
  • 使用云主机做网站教程如何做一个自己的网站
  • 合江县住房建设规划局网站爱站网关键词挖掘查询工具
  • 园区网互联及网站建设项目口碑营销成功案例有哪些
  • 阜阳网站网站建设seo优化教程视频