最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • django外键如何赋值

    正文概述    2020-08-01   288

    django外键如何赋值

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

    了解外键

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

    使用外键

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

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

    1. 在同一个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这个模型中新添加一个属性

    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来指定。可以指定的类型如下:

    CASCADE:级联操作。如果外键对应的那条数据被删除了,那么这条数据也会被删除。

    PROTECT:受保护。即只要这条数据引用了外键的那条数据,那么就不能删除外键的那条数据。如果我们强行删除,Django就会报错。

    SET_NULL:设置为空。如果外键的那条数据被删除了,那么在本条数据上就将这个字段设置为空。如果设置这个选项,前提是要指定这个字段可以为空。

    SET_DEFAULT:设置默认值。如果外键的那条数据被删除了,那么本条数据上就将这个字段设置为默认值。如果设置这个选项,== 前提是要指定这个字段一个默认值 ==。

    SET():如果外键的那条数据被删除了。那么将会获取SET函数中的值来作为这个外键的值。SET函数可以接收一个可以调用的对象(比如函数或者方法),如果是可以调用的对象,那么会将这个对象调用后的结果作为值返回回去。== 可以不用指定默认值 ==

    DO_NOTHING:不采取任何行为。一切全看数据库级别的约束。

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

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

    RESTRICT:默认的选项,如果想要删除父表的记录时,而在子表中有关联该父表的记录,则不允许删除父表中的记录;

    NOACTION:同 RESTRICT效果一样,也是首先先检查外键;

    CASCADE:父表delete、update的时候,子表会delete、update掉关联记录;

    SET NULL:父表delete、update的时候,子表会将关联记录的外键字段所在列设为null,所以注意在设计子表时外键不能设为not null。


    起源地下载网 » django外键如何赋值

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元