外键和表关系
外键:
在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam。如果使用的是InnoDB引擎,是支持外键约束的。外键的存在使得ORM框架在处理表关系的时候异常的强大。
类定义为class ForeignKey(to,on_delete,**options)。第一个参数是引用的是哪个模型,第二个参数是在使用外键引用的模型数据被删除了,这个字段该如何处理,比如有CASCADE(级联删除)、SET_NULL(设置为空)等。以下为实际案例,如有一个Category和一个Article两个模型。一个Category可以有多篇文章,一个Article假设只能有一个Category,并且通过外键进行引用。
新建Django项目orm_relationship_demo,在cmd中进入当前项目创建一个app,使用命令:python manage.py startapp article,创建一个叫articel的app,并在settings.py文件下的INSTALLED_APPS完成注册。
项目目录结构:
数据库配置,也是在settins.py文件下的DATABASES:
在artice的models.py下写入如下代码:
from django.db import models
class Category(models.Model):
name = models.CharField(max_length=100)
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
category = models.ForeignKey("Category", on_delete=models.CASCADE)
将两张表(Category和Article)映射到数据库中:cmd进入当前项目所在的目录,使用命令python manage.py makemigrations和python manage.py migrate,将其映射到数据库。
成功后在Navicat中看到如下结果:
给Article指定Category,在views.py中有如下代码:
from django.shortcuts import render
from .models import Category, Article
from django.http import HttpResponse
# Create your views here.
def index(request):
article = Article(title='abc', content='11111111')
category = Category(name='最新文章')
category.save()
article.category = category
article.save()
return HttpResponse('success')
在articel下新建urls.py,内容如下:
from django.urls import path
from . import views
app_name = 'article'
urlpatterns = [
path('', views.index, name='index')
]
在orm_relationship_demo的urls.py中,写入如下代码:
from django.urls import path, include
from article import views
urlpatterns = [
path('', include('article.urls')) #首页
]
运行项目,访问http://127.0.0.1:8000/,页面返回success,
再次查看navicate,结果如下:
可以看到article的category_id就是Category表中的id,说明外键关联是成功的。