亲宝软件园·资讯

展开

Django 外键

stu_xujin 人气:0

在写项目的过程中我们不可避免的会使用到外键这个东西,那么Django中是怎样来使用外键的呢?

了解外键

在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam。如果使用的是InnoDB引擎,是支持外键约束的。外键的存在使得ORM框架在处理表关系的时候异常的强大。MySQL数据库默认使用的也是InnoDB引擎。

使用外键

新建一个项目,创建一个article的app,添加至settings中,并且在settings中设置数据库的连接,调至整个项目能运行为止。

类定义为class ForeignKey(to,on_delete,**options)。第一个参数是引用的是哪个模型,第二个参数是在使用外键引用的模型数据被删除了,这个字段该如何处理,比如有CASCADE、SET_NULL等(外键删除各个参数的意思)。这里以一个实际案例来说明。比如有一个Category和一个Article两个模型。一个种类下可以包含多篇文章,一个Article只能有一个种类,并且通过外键进行引用。那么相关的示例代码如下:

在同一个app中使用外键

在article中的models中写入代码:

from django.db import models

# Create your models here.
class Category(models.Model):
    name = models.CharField(max_length=100)

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    # 是由Category影响Article
    category = models.ForeignKey('Category',on_delete=models.CASCADE)

这里我们就在Article中设置了一个外键category。

以上使用ForeignKey来定义模型之间的关系。即在article的实例中可以通过category属性来操作对应的Category模型。这样使用起来非常的方便。示例代码如下:views中写入

from django.shortcuts import render
from . import models
from django.http import HttpResponse

# Create your views here.
def index(request):
    
    # 插入数据
    # article = models.Article(title='abc',content='111')
    # category = models.Category(name='最新文章')
    # category.save()
    # article.category = category
    # article.save()

    #读取数据
    article = models.Article.objects.first()
    print(article.category.name)
    return HttpResponse('successful')

在上面代码中把相应的注释去了,就能够进行测试了。

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

如果想要引用另外一个app的模型,那么应该在传递to参数的时候,使用app.model_name进行指定。例如,如果User和Article不是在同一个app中,那么在引用的时候的示例代码如下:
首先新建一个user的app,并且添加至settings中,在user中的models中写入代码,创建一个User模型

from django.db import models

# Create your models here.
class User(models.Model):
    username = models.CharField(max_length=100)

再在article中的models中添加这个外键,即在Article这个模型中新添加一个属性

# 将user中的User这个模型作为外键
author = models.ForeignKey('user.User',on_delete=models.CASCADE,null=True)

如果模型的外键引用的是本身自己这个模型,那么to参数可以为self,或者是这个模型的名字。在论坛开发中,一般评论都可以进行二级评论,即可以针对另外一个评论进行评论,那么在定义模型的时候就需要使用外键来引用自身。示例代码如下:

class Comment(models.Model):
    content = models.TextField()
    orihin_comment = models.ForeignKey('self',on_delete=models.CASCADE)

这样我们就实现了添加了一个外键引用自身。

外间删除操作的参数意思:

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

以上这些选项只是Django级别的,数据级别依旧是RESTRICT!

数据库层面的约束有四种:

参考链接:https:

为什么ORM能越过数据库的约束呢?

是因为ORM操作是反过来的,比如我们在ORM模型中设置了on_delete=models.CASCADE,那么在进行删除的时候,如果发现在数据库层面有父表约束着它,使他不能被删除,那么ORM就会先去删除父表,再来删除指定的表,从而达到越过了数据库层面的约束。

加载全部内容

相关教程
猜你喜欢
用户评论