在一对多和多对多中使用ORM
Posted chengdongzi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在一对多和多对多中使用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)
以上是关于在一对多和多对多中使用ORM的主要内容,如果未能解决你的问题,请参考以下文章