zoukankan      html  css  js  c++  java
  • 在一对多和多对多中使用ORM

    1. ORM
    1. ORM常用字段和属性
      1. AutoField(primary_key=True)
      2. CharField(max_length=32)
      3. IntgerField()
      4. DateField()
      5. DateTimeField()
    1. auto_now_add --> 创建的时候自动填充当前时间
    2. auto_now --> 每次修改的时候自动把当前时间更新

    2. 关系字段
      1. ForeignKey(to="类名",related_name=“xx”) --> 1对多 ,外键通常设置在多的那一边、
      2. ManyToMany(to="类名",related_name="xx") --> 多对多,通常设置在正向查询多的那一边

    3. ORM一般操作
      1. 必知必会13条
        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. Book.objects.filter(id__gt=1)    查询大于
          2. Book.objects.filter(id__in=[1,2,3])   查询是否包含
          3. Book.objects.filter(id__range=[1,5])   查询范围
          4. Book.objects.filter(title__contains="沙河")  查询包含的数据
          5. Book.objects.filter(title__icontains="沙河")  查询包含的数据英文忽略大小写
          6. Book.objects.filter(title__startswith="沙河")   查询以什么数据开头
          7. Book.objects.filter(title__endswith="沙河")    查询以什么数据结尾
          8. Book.objects.filter(publish_date__year=2017)   日期查询 年
          9. Book.objects.filter(publish_date__month=2)     日期查询月
       3. 外键的跨表查询
          1. 正向查找
            1. 基于对象
              book_obj = Book.object.get(id=1)
              book_obj.publisher.name

          2. 基于双下划线的
              Book.object.filter(id=1).values("publisher__name")

          2. 反向查找(由出版社查书)
            1. 基于对象
                publisher_obj = Publisher.objects.get(id=1)
              默认反向查找的时候是表名加_set
                publisher_obj.book_set.all()
              如果在外键中设置了related_name="books"
                publisher_obj.books.all()

            2. 基于双下划线
                Publisher.objects.filter(id=1).values("book__title")
            如果配置了related_query_name="books"
                Publisher.objects.filter(id=1).values("books__title")

        4. 分组和聚合
          1. 聚合
            from .models import Avg, Sum, Max, Min, Count
            Book.objects.all().aggregate(Avg("price"))
          2. 分组
            book_list = Book.objects.all().annotate(author_num=Count("author"))

        5. F和Q
            1. 当需要字段和字段作比较的时候用F查询
            2. 当查询条件是 或 的时候 用Q查询,因为默认的filter参数都是且的关系

        6. 事务
            1. 保证数据的原子性操作!!!

        7. 执行原生的SQL语句(了解即可)

    2. ORM 一对一
        1. 什么时候用一对一?
          当 一张表的某一些字段查询的比较频繁,另外一些字段查询的不是特别频繁
          把不怎么常用的字段 单独拿出来做成一张表 然后用过一对一关联起来

        2. 优势
          既保证数据都完整的保存下来,又能保证大部分的检索更快

    3. ORM中的用法
        OneToOneField(to="")

        from app01 import models

    # 一对一的查询
    # author_obj = Author.objects.get(id=1)
    # obj = author_obj.detail
    # print(obj.hobby, obj.addr)
  • 相关阅读:
    sizeof、strlen、length、size
    extern关键字
    结构
    引用
    指针
    数组
    linux端口 ,打开服务端口
    linux用户禁用
    防止验证码的恶意发送
    springboot 项目windows下打包、注册服务。
  • 原文地址:https://www.cnblogs.com/chengdongzi/p/10827417.html
Copyright © 2011-2022 走看看