zoukankan      html  css  js  c++  java
  • Django学习笔记(3)--数据库-2

    外键和表关系

    外键:

    在mysql中,表通常使用InnoDB,它支持外键约束。外键的存在似的ORM框架在处理表关系的时候非常强大,在Django中的应用:

    类定义为 class ForeignKey(to,on_delete,**options) ,第一个参数是引用的是哪个模型,第二个参数是在使用外键引用的模型数据被删除了,这个字段应该怎么处理,比如有CASCADE、SET_NULL等。这里以一个实际案例说明。

    有一个User和一个Article两个模型,一个User可以发表多篇文章,一个Aritcle只能有一个Author,并且通过外键引用。那么相关的 示例:

    calss User(models.Model):
        username = models.CharField(max_length=20)
        password = models.CharField(max_length=100)
    
    class Article(models.Model):
        title = models.CharField(max_length=100)
        content = model.TextField()
    
        author = models.ForeignKey('User',on_delete=models.CASCADE)

    以上使用ForeignKey来定义模型之间的关系。即在Article的实例中可以通过author属性来操作对应的User模型,这样使用起来非常方便。 示例:

    article = Aritcle(title='abc',content='123')
    author = User(username='张三',password='111111')
    article.author = author
    article.save()
    
    #修改article.author上的值
    article.author.username = '李四'
    article.save()

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

    如果想要引用另外一个app模型,那么应该在传递to参数的时候,使用app.model_name进行指定。以上例为例,如果User和Aritcle不是在同一个app中,那么在引用的时候的示例代码如下:

    #User模型在user这个app中
    calss User(models.Model):
        username = models.CharField(max_length=20)
        password = models.CharField(max_length=100)
    
    #Article模型在article这个app中
    class Article(models.Model):
        title = models.CharField(max_length=100)
        content = model.TextField()
    
        author = models.ForeignKey('user.User',on_delete=models.CASCADE)

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

    class Comment(models.Model):
        content = models.TextField()
        origin_commen = models.ForegnKey('self',on_delete=models.CASCADE,null=True)
        #或者
        #origin_commen = models.ForegnKey('Comment',on_delete=models.CASCADE,null=True)

    外键删除操作:

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

    1. CASCADE:级别操作。如果外键对应的那条数据被删除了,那么这条数据也会被删除。
    2. PROTECT:受保护。即只要这条数据引用了外键的那条数据,那么就不能删除外键的那条数据。
    3. SET_NULL:设置为空。如果外键的那条数据被删除 了,那么在本条数据上就将这个字段设置为空。如果 设置这个选项,前提是要指定这个字段可以为空。
    4. SET_DEFAULT:设置默认值。如果外键的那条数据被删除了,那么本条数据上就将这个字段设置为默认值。如果设置这个选项,前提是要指定这个字段可以为空。
    5. SET():如果外键的那条数据被删除了。那么将会获取SET函数中的值来作为这个外键的值。SET函数可以接收一个可以调用的对象(比如函数或者方法),如果是可以被调用的对象,那么会将这个对象调用后的结果作为值返回回去。
    6. DO_NOTHING:不参取任何行动。一切全看数据库级别的约束。

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

  • 相关阅读:
    【转】Windows Phone的应用程序认证要求
    ObservableCollection删除问题
    国庆总结?
    .net dll破解实战
    理理头绪
    创建Metro风格的WPF界面
    Alpha项目测试
    原型设计
    团队项目总结
    最常用的35中心里效应
  • 原文地址:https://www.cnblogs.com/LMIx/p/10827553.html
Copyright © 2011-2022 走看看