django框架 day05

今日内容:

模型层:就是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
View Code

首先创建模型表出来:

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() # 清空当前书籍与作者的所有关系
View Code

跨表查询(重点):相当于 子查询 

子查询:将一张表的查询结果当做另外一个查询语句的条件
跨表查询分为 正向查询和反向查询

正向与反向的概念:

 # 一对一
    # 正向: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

猜你喜欢

转载自www.cnblogs.com/zahngyu/p/11553083.html