外键和表关系
在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam。如果使用的是InnoDB引擎,是支持外键约束的。外键的存在使得ORM框架在处理表关系的时候异常的强大。因此这里我们首先来介绍下外键在Django中的使用时需要设置引擎为innodb。
类定义为class ForeignKey(to,on_delete,**options)。第一个参数是引用的是哪个模型,第二个参数是在使用外键引用的模型数据被删除了,这个字段该如何处理,比如有CASCADE、SET_NULL等。这里以一个实际案例来说明。比如有一个Category和一个Article两个模型。一个Category可以有多个文章,一个Article只能有一个Category,并且通过外键进行引用。
在哪里定义外键?
对于一对多的关系,如一个图书馆分类在武侠小说的类中含有多本小说,而每一本小说只能在一个分类中(图书馆的真实场景,虚拟书属于多对多,以后讨论)
一条武侠小说数据只能有一个分类,可以在这里建外键,连接到对应的分类,而一个分类含有太多的武侠小说,所以不能建多个外键,结论:建外键在“多”中。
定义方式
models:
from django.db import models
# Create your models here.
class Category(models.Model):
name = models.CharField(max_length=20)
class Article(models.Model):
title = models.CharField(max_length=20)
content = models.TextField()
category = models.ForeignKey('Category',on_delete=models.CASCADE)
- 注:CASCADE级联删除,如果外键对应的那条数据被删除了,那么这条数据也会被删除。
- 一个category可以有多篇文章,但是一个article只能在一个category,删除了这个分类,这篇文章也被删
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
from .models import Category,Article
def news(request):
# 保存数据
# category = Category(name='言情')
# category.save()
# article = Article(title='金瓶梅',content='韦小宝和他的七个老婆')
# # #article.category_id = category #这样不行
# article.category = category
# article.save()
article = Article.objects.get(pk=2)
print(article.category.name)
return HttpResponse('news操作成功')
拆分代码:
生成数据:
category = Category(name='言情')
category.save()
article = Article(title='金瓶梅',content='韦小宝和他的七个老婆')
# article.category_id = category #这样不行
article.category = category
article.save()
查询数据,打印名字:
article = Article.objects.get(pk=2)
print(article.category.name)