zoukankan      html  css  js  c++  java
  • ORM常用操作

    ORM的使用
      1. 什么是ORM
        是一种编程的方法论(模型),与语言无关
      2. ORM的本质:
        类 --> 数据库表
        对象 --> 数据行
        属性 --> 字段
      3.ORM的功能:
        ORM操作数据表
        ORM操作数据行
      4.Django里的ORM的使用
        1.手动创建数据库
        2.在settings.py里面配置数据库的连接信息
        3.在项目init文件中告诉pymsql模块代替Mysqldb来连接mysql数据库
          import pymysql
          pymsql.install_as_MySQLdb()
        4.在app/models.py里面定义类,字段和属性
        5.执行两个命令
          1. python manage.py makemigrations -->将models的类映射成一个文件
          2,python manage.py migrate -->把映射的文件翻译成SQL语句去数据库执行

    ORM操作
      1.常用的操作方法
        1.返回QuerySet对象
          1. all()
          2. filter()
          3. values()
          4. values_list()
          5. exclude()
          6. order_by()
          7. reverse()
          8. distinct()
        2.返回具体对象的
          1. get()
          2. first()
          3. last()
        3.返回一个布尔值
          1. exists()
        4.返回具体数值
          1. count()
      2.单表查询的双下划线
        1. models.Book.objects.filter(id=1)
        2. models.Book.objects,filter(id__gt=1)
        3. models.Book.objects.filter(id__in=[1,2,3])
        4. models.Book.objects.filter(id__range=[1,5])
        5. models.Book.objects.filter(title__contains='沙河') #区分大小写
        6. models.Book.objects.filter(title__icontains='沙河') #不区分大小写
        7. models.Book.objects.filter(title__startwith='沙河')
        8. models.Book.objects.filter(title__endwith='沙河')
        9. models.Book.objects.filter(publisher_date__year=2017)
        10.models.Book.objects.filter(publisher-date__month=2)
      3.外键的跨表查询
        1.正向查找
          1. 基于对象
            book_obj = models.Boo.objects.get(id=1)
            book_obj.publisher.name
          2. 基于双下划线的
            models.Book.objects.filter(id=1).values('publisher__name')
        2.反向查找
          1.基于对象
            publisher_obj = models.Publisher.objects.get(id=1)
            默认反向查找的时候是表名_set
            publisher_obj.book_set.all()
            如果在外键中设置了related_name='books'
            publisher_obj.books.all()
          2.基于双下划线
            models.Publisher.objects.filter(id=1).values('book__title')
            如果配置了related_name='books'
            models.Publisher.objects.filter(id=1).values('books_title')
      4.分组和聚合
        1.聚合
          from django.db.models import Avg,Sum,Max,Min,Count
          models.Book.objects.all().aggregate(Avg('price'))
        2.分组
          book_list = models.Book.objects.all().annotate(author_num=Count('author'))
      5.F和Q
        1.F(当出现两个字段(可以是相同的字段)进行比较在括号内的时候)
          查询评论数大于收藏数的书籍
          from django.db.models import F
          models.Book.objects.filter(commnet_num__gt=F('keep_num'))
        2.Q(filter等方法中的关键字参数查询都是一起进行“AND” 的,如果涉及到与或非的话使用Q对象)
          查询出版年份是2017或2018,书名中带物语的所有书。
          models.Book.objects.filter(Q(publish_date__year=2018)
                | Q(publish_date__year=2017), title__icontains="物语")
      6. 事务(保证数据的原子性操作)
        from django.db import transaction
        with transaction.atomic(): (当出现错误的时候会回滚事务)
          new_publisher = models.Publisher.objects.create(name="火星出版社")
          models.Book.objects.create(title="橘子物语", publish_date=datetime.date.today(), publisher_id=10) # 指定一个不存在的出版社id
        except Exception as e:
          print(str(e))
      7. 原生的SQL在ORM
        from django.db import connection, connections
        cursor = connection.cursor() # cursor = connections['default'].cursor()
        cursor.execute("""SELECT * from auth_user where id = %s""", [1])
        ret = cursor.fetchone()
    2.ORM一对一
       1.什么时候用一对一?
          当一张表的某一些字段插叙你的比较频繁的时候,另外一些字段查询的不是特别频繁
          把不怎么常用的字段,单独拿出来做成一张表,然后用过一对一关联起来
       2.优势
          既保证了数据都完整的保存下来,又能保证大部分的检索更快
       3.ORM中的用法
          OneToOneField(to="")
       3.ORM多对多
          多对多的方式
       1.ORM自动帮我创建第三张表
       2.自己创建第三张表,利用外键分别关联作者和书
          关联查询比较麻烦,因为没办法使用ORM提供的便利方法
       3.自己创建第三张表,注意参数不能调换位置
          使用ORM的ManyToManyField(to="",through="Author2Book", through_fields=("author","book"))
          add() remove()都是使用不了
       怎么使用
        1.如果第三张表没有额外的字段,就用第一种
        2.如果第三张表有额外的字段,就用第三种或第一种

    4.跨站请求伪造
    {% crsf_token %} #在form表单添加这个自动校验-->生成一个加密的input框

  • 相关阅读:
    对于Python中self的看法
    SpringBoot整合MyBatis-Plus快速开始
    Hive原理--体系结构
    Docker Compose + Traefik v2 快速安装, 自动申请SSL证书 http转https 初次尝试
    记录:更新VS2019后单元测试运行卡住无法运行测试的问题。
    黑帽来源页劫持代码以及如何防范
    OFFICE 2010 每次打开提示安装的问题
    Mssql 查询某记录前后N条
    验证邮箱正则表达式,包含二级域名邮箱,手机号正则表达式支持170号段
    删除TFS上的团队项目
  • 原文地址:https://www.cnblogs.com/wuyiyuan/p/12022853.html
Copyright © 2011-2022 走看看