八月22日,django知识点总结:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
八月22日,知识点总结:
 
 
python manage.py makemigrations
python manage.py migrate一、增删改查
 
    1、添加表内容(三种方式)
        1.1 obj = models.UserType(列名=‘内容’)
            obj.save()
        1.2 models.UserType.objects.create(列名=‘内容’)
 
        1.3user_dict={'列名':‘内容’,'列名','内容’}
            models.UserType.objects.create(**user_dict)
 
 
    2、查询数据
        2.1 request.POST.get('usernaem')
            #获取单条数据,不存在则报错(不建议)
 
        2.2 ret =models.UserType.objects.all()
            #获取全部
            print(type(ret),ret.query)
            for item in ret:
                #根据循环可以输出表内容
                print(item,item.nid,item.caption)
                 
            #ret.query 返回一个原生SQL
            #ret,得到一个特殊的QuerySet对象
             
        2.3 ret =models.UserType.objects.all().values('nid')
            print(ret)
             
            #values('xxx') #返回一个列表中包含字典
         
        2.4 ret=models.UserType.objects.all().values_list('nid')
            print('ret')
             
            #返回一个列表中加元组
             
             
        2.5 model.UserType.objects.filter(name='name')
            # 获取指定条件的数据
             
 
    3、更改数据库内容
        3.1 models.UserInfo.objects.filter(user='alex').update(email='123@qq.com')
            #将指定的条件更新到数据库,可以使用字典**kwargs
         
        3.2 obj = models.UserInfo.objects.get(user='alex')
            obj = email='!!!!@!!!!!'
            obj.save()
            #修改单条数据
             
 
         
    4、删除数据
        4.1models.UserInfo.objects.filter(name='alex').delete()
            按条件删除
     
     
     
二、双下划线操作
    1.连表操作
        1.1 ret =models.UserInfo.objects.all().values('user','user_type__caption')
            ##user_type__caption  __双下划线在这是执行连表操作,输出另外表内容
         
        1.2 拿出类型是超级管理员的所有用户
            ret = models.UserInfo.objects.filter(user_type__caption="管理员").values('user','user_type__caption')
             
    2.多对多(ManyToMany)
        注:创建多台主机,多个部门
        1.自动创建关系表
            1.1 h2g =models.ManyToManyField('host')
                #创建多对多关系
                1.1.1 将多台机器分配给一个组
                    add添加关系,remove 删除表关系,delete删除表关系和表 set 添加,删除
                     
                    h = Host.objects.get(hid=1) ##只删除表关系
                    h.group_set.remove(*Group.objects.filter(gid__gt=1))
                     
                    h = Host.objects.get(hid=1)   ##添加表关系
                    h.group_set.add(*Group.objects.filter(gid__gt=1))
                     
                    h = Host.objects.get(hid=1)
                    h.group_set.all().delete() #delete删除表关系和表
                     
                    obj =Group.objects.get(gid=1)
                    print(obj.gid,obj.name,obj.h2g.all())
                        #bj.h2g.all() 是关系表,没创建关系输出空列表
                         
                    q =models.objects.filter(hid__gt=3)
                    obj.h2g.add(*q)
                        #将多台主机分到obj组
                         
                2.2.2 将一台主机分给多个组
                    h =Host.objects.get(hid=1)
                    obj =Group.objects.get(gid=1)
                    obj.h2g.add(h)    ##主机id等于1分配到第一组
                    obj =Group.objects.get(gid=2##
                    obj.h2g.add(h)###主机id等于1分配到第二组
                     
                    h =models.Host.objects.get(hid=1) ##找到第一台主机
                    h.group_set.add(*Group.objects.filter(gid__gt=2))
                        #gid大于2的所有分组分配给H主机
                         
                反向查找 表名__set ,查找什么表名就是什么
                h.models.Host.objects.get(hid=1)
                h.group_set.add(*models.Group.objects.filter(gid__gt=12))
                 
                注:
                    h = Host.objects.get(hid=1)
                    h.group_set.add(1) ##可以直接写数字添加
                    h.group_set.add(Group.objects.get(gid=1))
                    h.group_set.add(*[1,2,3]) ##可以用列表添加关系
                    h.group_set.set(Group.objects.filter(gid__gt=18), clear=True)
                    clear = True  清空在设置(添加)
                    set 不清空添加
                注:附加
                    update_or_create,get_or_create 这两个是一样的
                    都是给group和关系表添加数据   前提是关系表里不存在这个数据
                    列:
                 
                    # r = h.group_set.update_or_create(name='技术部')
                    如果没有技术部,就给group组中加上技术部,关系表中自动关联一条数据
                    # print(r)
                    # r = h.group_set.get_or_create(name='人事部')
                    # print(r)
                 
             
        2.自己创建表关系
            HostToGroup.objects.create(Host_id_id=1,group_id_id=2,status=11)
            #添加内容
         
    创建索引
     class HostToGroup(models.Model):
#     hgid = models.AutoField(primary_key=True)
#     host_id = models.ForeignKey('Host')
#     group_id = models.ForeignKey('Group')
#     status = models.IntegerField()
#     class Meta:
#         unique_together = [   ###定义唯一索引,里面的索引值就不可以重复
#             ('host_id', 'group_id'),
#         ]

  unique=true是指这个字段的值在这张表里不能重复,所有记录值都要唯一,就像主键那样搜索nullable=false是这个字   段在保存时必需有值,不能还是null值就调用save去保存入库

  

 

 

实例

# 1、查询所有图书类型为“科学”的所有书籍的 名称、价格、发布时间、图书类型(两种方式)

# 2、查询作者“alex"参与编写的所有书籍(两种方式)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Author(models.Model):
    '''
    作者
    '''
    name = models.CharField(max_length=100)
    age = models.IntegerField()
 
class BookType(models.Model):
    '''
    图书类型
    '''
    caption = models.CharField(max_length=64)
 
class Book(models.Model):
    '''
    图书
    '''
    name = models.CharField(max_length=64)
    pages = models.IntegerField()
    price = models.DecimalField(max_digits=10, decimal_places=2)
    #         数字长度max_digits,有效位数decimal_places
    pubdate = models.DateField()  ##出版事件
    authors = models.ManyToManyField(Author)
    book_type = models.ForeignKey(BookType)

 

表中添加内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# models.Author.objects.create(name='alex',age=12)
    # models.Author.objects.create(name='sunqihu',age=15)
    # models.Author.objects.create(name='jay',age=16)
    #
    # models.BookType.objects.create(caption='文学')
    # models.BookType.objects.create(caption='科学')
    # models.BookType.objects.create(caption='数学')
    #
    # book_mode={"name":"一路向西",
    #            "pages":300,
    #            "price":50,
    #            "pubdate":"2011-09-09",
    #            "book_type_id":2
    #
    #            }
    # models.Book.objects.create(**book_mode)

  

添加关系

1
2
3
4
5
6
7
# h =models.Book.objects.get(id=1)
   # h.authors_set.add(models.Author.objects.filter(id=2))
   # h =models.Book.objects.all().get(id=1)
   # obj =models.Author.objects.all().filter(id=3)
   # print(type(obj))
   # # print(h,type(h))
   # obj.book_set.add(h)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 第一种方法
# rat = models.Book.objects.filter(book_type__caption='科学').values(
#     'name','price','pubdate','book_type__caption'
# )
# print(rat)
# for i in rat:
#     print(i)
# rem =models.Book.objects.filter(authors__name='sunqihu').values('name','authors__name')
# print(rem)
 
 
#第二种方法
 
# objs =models.BookType.objects.get(caption="科学")
# obj =objs.book_set.values('name','price','pubdate','book_type__caption')
# print(obj)
 
 
# obj = models.Author.objects.get(name='sunqihu')
# obs =obj.book_set.values('name','authors__name')
# print(obs)

  

 

posted @   青春永不言弃  阅读(373)  评论(1)    收藏  举报
编辑推荐:
· 从零实现富文本编辑器#3-基于Delta的线性数据结构模型
· 记一次 .NET某旅行社酒店管理系统 卡死分析
· 长文讲解 MCP 和案例实战
· Hangfire Redis 实现秒级定时任务,使用 CQRS 实现动态执行代码
· Android编译时动态插入代码原理与实践
阅读排行:
· 使用TypeScript开发微信小程序(云开发)-入门篇
· 没几个人需要了解的JDK知识,我却花了3天时间研究
· 在SqlSugar的开发框架中增加对低代码EAV模型(实体-属性-值)的WebAPI实现支持
· C#高性能开发之类型系统:从 C# 7.0 到 C# 14 的类型系统演进全景
· .NET Core中的配置Configuration实战
点击右上角即可分享
微信分享提示