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框

原文地址:https://www.cnblogs.com/wuyiyuan/p/12022853.html