今日内容:
模型层:就是rom 操作数据库的增删改查
ps:在django中 你可以写一个单独测试某一个py文件的测试脚本 不需要再频繁的走web请求,也可以在tests里面写
需要导入固定句式的模块:
1 import os 2 3 4 if __name__ == "__main__": 5 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day55.settings") 6 import django 7 django.setup() 8 """在下面就可以写针对某一个py文件的测试代码""" 9 from app01 import models
首先创建模型表出来:
1.一对多字段的增删改查:
# 一对多字段的增删改查 # 增 有俩个方法 # 1.字段名 publish_id 直接传数字 models.Book.objects.create(title='三国演义',price=199.99,publish_id=1) # 2.获取你要传入的出版社对象 然后 publish直接传出版社对象 publish_obj = models.Publish.objects.filter(pk=2).first() models.Book.objects.create(title='红楼梦',price=999.99,publish=publish_obj) # 改 也是俩种方法 # 1.字段名 publish_id 直接传数字 models.Book.objects.filter(pk=1).update(publish_id=3) # 2.获取你要修改的出版社对象 然后 publish直接传要修改出版社对象 publish_obj = models.Publish.objects.filter(pk=2).first() models.Book.objects.filter(pk=1).update(publish=publish_obj) # 删 # 默认是级联删除 级联更新 models.Publish.objects.filter(pk=1).delete()
2.多对多字段的增删改查
1 一共就4个方法: 2 add() 3 set() 4 remove() 5 上面三个都支持传数字 或者对象 并且可以传多个 但是set需要传可迭代对象 6 clear() 7 clear括号内不需要传任何参数 8 9 # 增: 10 # 1. 要为主键为1的书籍添加2个作者 通过数字 11 book_obj = models.Book.objects.filter(pk=1).first() 12 # # 对象点击多对多虚拟字段 会直接跨到多对多的第三张表 13 print(book_obj.authors) # app01.Author.None 14 book_obj.authors.add(1) 15 book_obj.authors.add(2,3) 16 17 # 2.通过对象 18 author_obj = models.Author.objects.filter(pk=1).first() 19 author_obj1 = models.Author.objects.filter(pk=2).first() 20 author_obj2 = models.Author.objects.filter(pk=3).first() 21 book_obj = models.Book.objects.filter(pk=1).first() 22 book_obj.authors.add(author_obj) 23 book_obj.authors.add(author_obj1,author_obj2) 24 ''' 25 注意:add() 26 是给书籍添加作者 括号内既可以传数字也可以传对象 27 并且支持一次性传多个 逗号隔开即可 28 ''' 29 30 # 改 31 # 1.传数字 32 # 将主键1的书籍对象 作者修改为2,3 33 book_obj = models.Book.objects.filter(pk=1).first() 34 book_obj.authors.set([2,]) 35 book_obj.authors.set([2,3]) 36 37 # 2.传对象 38 author_obj = models.Author.objects.filter(pk=1).first() 39 author_obj1 = models.Author.objects.filter(pk=2).first() 40 author_obj2 = models.Author.objects.filter(pk=3).first() 41 book_obj = models.Book.objects.filter(pk=1).first() 42 book_obj.authors.set([author_obj,]) 43 book_obj.authors.set([author_obj,author_obj1,author_obj2]) 44 ''' 45 注意:set() 46 set()括号内 需要传一个可迭代对象 47 可迭代对象中 可以是多个数字组合 48 也可以是多个对象组合 49 但是不要混着用!!! 50 ''' 51 # 删 52 # 1.传数字 53 book_obj = models.Book.objects.filter(pk=1).first() 54 book_obj.authors.remove(3) 55 book_obj.authors.remove(1,2) 56 # 2. 传对象 57 author_obj = models.Author.objects.filter(pk=1).first() 58 author_obj1 = models.Author.objects.filter(pk=2).first() 59 author_obj2 = models.Author.objects.filter(pk=3).first() 60 book_obj = models.Book.objects.filter(pk=1).first() 61 book_obj.authors.remove(author_obj) 62 book_obj.authors.remove(author_obj1,author_obj2) 63 ''' 64 注意: 65 remove()括号内既可以传数字 也可以传对象 66 并且支持传对个 逗号隔开即可 67 ''' 68 # clear() 清空所有数据 69 book_obj = models.Book.objects.filter(pk=1).first() 70 book_obj.authors.clear() # 清空当前书籍与作者的所有关系
跨表查询(重点):相当于 子查询
子查询:将一张表的查询结果当做另外一个查询语句的条件
跨表查询分为 正向查询和反向查询 正向与反向的概念: # 一对一 # 正向:author---关联字段在author表里--->authordetail 按字段 # 反向:authordetail---关联字段在author表里--->author 按表名小写 # 一对多 # 正向:book---关联字段在book表里--->publish 按字段 # 反向:publish---关联字段在book表里--->book 按表名小写_set.all() 因为一个出版社对应着多个图书 # 多对多 # 正向:book---关联字段在book表里--->author 按字段 # 反向:author---关联字段在book表里--->book 按表名小写_set.all() 因为一个作者对应着多个图书 说简单点就是: 基于找的这一方有外键字段就是正向,没有就是反向 正向查询按外键字段 反向查询按表名小写
重点:
当你正向查询的时候,查询的结果是多个,那么就需要 点all()
当你反向查询的结果是多个的时候 就需要加_set 在点all()
否则直接表明小写即可
View Code
基于双下滑线的跨表查询:相当于连表操作
left join
inner join
right join
union