django框架之13:外键约束

外键和表关系

在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)

你可能感兴趣的:(django框架,django)