17-2 orm单表操作和多表操作
参考:https://www.cnblogs.com/liwenzhou/p/8660826.html
一 ORM单表操作
1 增删改查
1 1. 查询 2 1. 查所有 3 models.Publisher.objects.all() 4 2. 查某个具体的记录 5 models.Publisher.objects.get(id=1) --> 注意查询条件不成立就报错 6 2. 删除一条记录 7 models.Publisher.objects.get(id=1).delete() 8 3. 创建一条记录 9 models.Publisher.objects.create(name="新出版社名字", addr="出版社地址") 10 4. 修改一条记录 11 obj = models.Publisher.objects.get(id=1) 12 obj.name = "新名字" 13 obj.save()
2 字段和参数:
--1. 字段
1. CharField 字符类型,必须提供max_length
2. AutoField int自增
3. DateField 日期字段
4. DateTimeField() 日期时间字段
5. IntergeField() 整数类型
--2. 参数
1. null=True 可以为空
2. default=默认值
3. unique=True 表示是唯一的
--4. 时间字段
1. auto_now_add=True 创建数据记录的时候会把当前时间添加到数据库
2. auto_add=True 每次更新数据记录的时候会更新该字段。
3 ORM必知必会单表查询13条:
1. all() --> 查询所有结果 2. filter() --> 根据查询条件查询数据库的 3. get() --> 获取一个唯一的值 4. exclude() --> 将符合条件的都剔除掉,留下不符合条件的 5. values('字段名', ...) --> 返回一个QuerySet,里面是字典 6. values_list(字段名', ...) --> 返回一个QuerySet,里面是元祖 7. order_by() --> 对查询结果排序 8. reverse() --> 对一个有序的查询结果集做反转 9. distinct() --> 去重,跨表查询时去掉重复的记录,MySQL不支持按字段去重 10. count() --> 返回数据条数 11. first() --> 取第一个数据 12. last() --> 取最后一条数据 13. exists() --> 判断表里有没有数据
分类:
1. 返回QuerySet列表的有哪一些?
1. all()
2. filter()
3. exclude()
4. order_by()
5. reverse()
6. distinct()
7. values('字段名', ...) --> 查询结果的列表里,都是字典
8. values_list(字段名', ...) --> 查询结果的列表里,都是元祖
2. 返回具体对象的
1. first()
2. last()
3. get()
3. 返回数字的
1. count()
4. 返回布尔值
1. exists()
4 单表查询双下划线操作
例子:
1 models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值 2 3 models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据 4 models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in 5 6 models.Tb1.objects.filter(name__contains="ven") # 获取name字段包含"ven"的 7 models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感 8 9 models.Tb1.objects.filter(id__range=[1, 3]) # id范围是1到3的,等价于SQL的bettwen and 10 11 类似的还有:startswith,istartswith, endswith, iendswith 12 13 date字段还可以: 14 models.Class.objects.filter(first_day__year=2017)
5 如何在一个py文件中 使用Django项目的相关配置或内容,比如之间连接djanjo里面的数据库,在新建的py文件里面写上下面这个即可:
import os if __name__ == '__main__': os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings") import django django.setup() from app01 import models
二 ORM跨表操作
1 外键 ForeignKey
通过Foreignkey字段 ,能够得到和我关联的那个对象
数据库中保存的字段名是 外键字段_id
例子:书名关联出版社
1 class Book(models.Model): 2 title = models.CharField(max_length=32) 3 publisher = models.ForeignKey(to="Publisher", on_delete=models.CASCADE)
on_delete=models.CASCADE的意思是当主表删除数据之后,从表也跟着删除
2 外键增删改查操作
详情见练习和作业
3 跨表查询:
正向查询:
# 查询第一本书关联的出版社的名字 # 1. 基于对象的查询 # book_obj = models.Book.objects.first() # ret = book_obj.publisher.name # print(ret) # 2. 基于queryset的双下划线查询,双下划线表示跨表 # ret = models.Book.objects.all().values_list("publisher__name").distinct() # print(ret)
# 反向查询
# 由出版社反向查找书籍 publisher_obj=models.Publisher.objects.get(id=2) books=publisher_obj.book_set.all() title=books.values_list("title","id") print(title) # 2. 基于queryset的双下划线 # 江出版社出版的所有书籍的书名 ret = models.Publisher.objects.filter(id=2).values_list("book__title","book__id") print(ret)