Django的ORM模型外键使用详解

本文介绍在Django框架中使用ORM进行表关系管理,特别是外键的应用,包括外键定义、级联删除和设置为空等选项,以及通过实例演示如何在Category和Article模型间建立外键关联。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

外键和表关系

外键:

在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,说明外键关联是成功的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值