zoukankan      html  css  js  c++  java
  • 六、ORM模型层补充

    Django之ORM

    ORM初识

    1. 概念:ORM(Object Relational Mapping)对象关系映射模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。

    2. 作用:能够让用户不用SQL语句的小白也能够通过python面向对象的代码简单快捷的操作数据库

    3. 不足:封装程度太高,有时操作起来效率太低,需要自己写SQL语句

    4. ORM与面向对象关系对比

      """
      类								表
      对象							   记录
      对象属性						  记录某个字段对应的值
      """
      
    5. 具体示例

      应用下面的models.py文件
      """
      
      # 1 先去models.py中书写一个类
      	class User(models.Model):
          # id int primary_key auto_increment
          id = models.AutoField(primary_key=True)
          # username varchar(32)
          username = models.CharField(max_length=32)
          # password int
          password = models.IntegerField()
      
      *************************# 2 数据库迁移命*************************
      python3 manage.py makemigrations 将操作记录记录到小本本上(migrations文件夹)
      
      python3 manage.py migrate  将操作真正的同步到数据库中
      # 只要你修改了models.py中跟数据库相关的代码 就必须重新执行上述的两条命令
      ****************************************************************
      
      class User(models.Model):
          # id int primary_key auto_increment
          id = models.AutoField(primary_key=True,verbose_name='主键')
          # username varchar(32)
          username = models.CharField(max_length=32,verbose_name='用户名')
          """
          CharField必须要指定max_length参数 不指定会直接报错
          verbose_name该参数是所有字段都有的 就是用来对字段的解释
          """
          # password int
          password = models.IntegerField(verbose_name='密码')
      
      
      class Author(models.Model):
          # 由于一张表中必须要有一个主键字段 并且一般情况下都叫id字段
          # 所以orm当你不定义主键字段的时候 orm会自动帮你创建一个名为id主键字段
          # 也就意味着 后续我们在创建模型表的时候如果主键字段名没有额外的叫法 那么主键字段可以省略不写
          # username varchar(32)
          username = models.CharField(max_length=32)
          # password int
          password = models.IntegerField()
      

    字段增删查改

    # 字段的增
    	1.可以在终端内直接给出默认值
        2.该字段可以为空
        info = models.CharField(max_length=32,verbose_name='个人简介',null=True)
        3.直接给字段设置默认值
        hobby = models.CharField(max_length=32,verbose_name='兴趣爱好',default='study')
     
    # 字段的改
    	直接修改代码然后执行数据库迁移的两条命令即可!
    
    # 字段的删
    	直接注释对应的字段然后执行数据库迁移的两条命令即可!
        执行完毕之后字段对应的数据也都没有了
      
    # 字段的查
    	直接在models.py中查看即可
    """
    在操作models.py的时候一定要细心
    	千万不要注释一些字段
    	执行迁移命令之前最好先检查一下自己写的代码
    """
    
    # 个人建议:当你离开你的计算机之后一定要锁屏
    

    数据的增删查改

    # 数据的查
    user_obj = models.User.objects.filter(username=user_name).first() # 相当于where按照关键字查找
    user_queryset = models.User.object.filter() # 拿全部的数据对象
    user_queryset = models.User.object.all() # 拿全部的数据对象
    
    
    # 数据的增
    	数据添加方式一:
            user_obj = models.User.objects.create(username=user_name,password=pass_word)
        数据添加方式二:
            user_obj =models.User(username=user_name,password=pass_word)
            user_obj.save()
    # 数据的删
    	models.User.objects.filter(id=delete_id).delete()
        
    # 数据的改
    	方式一:当数据特别大时,此种方法效率特别低
            edit_obj.username = user_name
            edit_obj.password = pass_word
            edit_obj.save()
            
        方式二:批量修改,效率高
        	models.User.objects.filter(id=edit_id).update(username=user_name,password=pass_word)
    

    django orm中如何创建表关系

    1. 表关系

      • 一对一
      • 一对多
      • 一对一
      • 没有关系
    2. 判断关系的方法:换位思考

    3. 注意

      • 在Django1.X版本中,外键默认都是级联更新级联删除的
      • 多对多的表关系可以有好几种方式创建
    4. 总结:

    • ForeignKey、OneToOneField会自动在字段后面加上_id后缀
    1. 具体示例

      """
      表与表之间的关系
      	一对多
      	
      	多对多
      	
      	一对一
      	
      	没有关系
      
      判断表关系的方法:换位思考
      
      """
      图书表
      
      出版社表
      
      作者表
      
      作者详情表
      
      
      """
      图书和出版社是一对多的关系 外键字段建在多的那一方 book
      	
      图书和作者是多对多的关系 需要创建第三张表来专门存储
      
      作者与作者详情表是一对一
      """
      from django.db import models
      
      # Create your models here.
      
      
      # 创建表关系  先将基表创建出来 然后再添加外键字段
      class Book(models.Model):
          title = models.CharField(max_length=32)
          price = models.DecimalField(max_digits=8,decimal_places=2)
          # 总共八位 小数点后面占两位
          """
          图书和出版社是一对多 并且书是多的一方 所以外键字段放在书表里面
          """
          publish = models.ForeignKey(to='Publish')  # 默认就是与出版社表的主键字段做外键关联
          """
          如果字段对应的是ForeignKey 那么会orm会自动在字段的后面加_id
          如果你自作聪明的加了_id那么orm还是会在后面继续加_id
          
          后面在定义ForeignKey的时候就不要自己加_id
          """
      
      
          """
          图书和作者是多对多的关系 外键字段建在任意一方均可 但是推荐你建在查询频率较高的一方
          """
          authors = models.ManyToManyField(to='Author')
          """
          authors是一个虚拟字段 主要是用来告诉orm 书籍表和作者表是多对多关系
          让orm自动帮你创建第三张关系表
          """
      
      
      class Publish(models.Model):
          name = models.CharField(max_length=32)
          addr = models.CharField(max_length=32)
      
      
      class Author(models.Model):
          name = models.CharField(max_length=32)
          age = models.IntegerField()
          """
          作者与作者详情是一对一的关系 外键字段建在任意一方都可以 但是推荐你建在查询频率较高的表中
          """
          author_detail = models.OneToOneField(to='AuthorDetail')
          """
          OneToOneField也会自动给字段加_id后缀
          所以你也不要自作聪明的自己加_id
          """
      
      class AuthorDetail(models.Model):
          phone = models.BigIntegerField()  # 或者直接字符类型
          addr = models.CharField(max_length=32)
      
      
      """
      	orm中如何定义三种关系
      		publish = models.ForeignKey(to='Publish')  # 默认就是与出版社表的主键字段做外键关联
      		
      		authors = models.ManyToManyField(to='Author')
      		
      		author_detail = models.OneToOneField(to='AuthorDetail')
      		
      		
      		ForeignKey
      		OneToOneField
      			会自动在字段后面加_id后缀
      		ManyToManyField
      			不会生成该字段,只是告诉ORM要建立一个多对多关系,并且会生成一个表
      """
      
      # 在django1.X版本中外键默认都是级联更新删除的
      # 多对多的表关系可以有好几种创建方式 这里暂且先介绍一种
      # 针对外键字段里面的其他参数 暂时不要考虑 如果感兴趣自己可以百度试试看
      
      
  • 相关阅读:
    leetcode 279. Perfect Squares
    leetcode 546. Remove Boxes
    leetcode 312. Burst Balloons
    leetcode 160. Intersection of Two Linked Lists
    leetcode 55. Jump Game
    剑指offer 滑动窗口的最大值
    剑指offer 剪绳子
    剑指offer 字符流中第一个不重复的字符
    leetcode 673. Number of Longest Increasing Subsequence
    leetcode 75. Sort Colors (荷兰三色旗问题)
  • 原文地址:https://www.cnblogs.com/borntodie/p/14330664.html
Copyright © 2011-2022 走看看