1 QuerySet支持链式操作:
2 models.表名.objects.all().filter().values().distinct().count()
3
4 QuerySet数据类型特征:
5 1、可切片、可迭代;
6 2、惰性查询:
7 article_list=models.Article.objects.all()
8 print(article_list) # 使用时才会走数据库
9
10 3、缓存机制:
11 for i in article_list:
12 print(i.title) # hit the database
13 for i in article_list:
14 print(i.title) # not hit the database
15 -----------------------------
16 for i in models.Article.objects.all():
17 print(i.title) # hit the database
18 for i in models.Article.objects.all():
19 print(i.title) # hit the database
20
21 4、优化查询:
22 article_list = models.Article.objects.all().iterator()
23 for i in article_list:
24 print(i.title) # hit the database
25 for i in article_list:
26 print(i.title) # 无结果,迭代器只能前进不能后退。
27
28 连表操作:
29 表关系:
30 class Category(models.Model):
31 """
32 博主个人文章分类表
33 """
34 nid = models.AutoField(primary_key=True)
35 title = models.CharField(verbose_name='分类标题', max_length=32)
36
37 class Article(models.Model):
38 """
39 文章表
40 """
41 nid = models.BigAutoField(primary_key=True)
42 title = models.CharField(max_length=50, verbose_name='文章标题')
43 desc = models.CharField(max_length=255, verbose_name='文章描述')
44 category = models.ForeignKey(verbose_name='文章类型', to='Category', to_field='nid', null=True)
45 user = models.ForeignKey(verbose_name='所属用户', to='UserInfo', to_field='nid')
46 tags = models.ManyToManyField(
47 to="Tag",
48 through='Article2Tag',
49 through_fields=('article', 'tag'),
50 )
51
52 class ArticleDetail(models.Model):
53 """
54 文章详细表
55 """
56 nid = models.AutoField(primary_key=True)
57 content = models.TextField(verbose_name='文章内容', )
58
59 article = models.OneToOneField(verbose_name='所属文章', to='Article', to_field='nid')
60
61 class Tag(models.Model):
62 """
63 标签表
64 """
65 nid = models.AutoField(primary_key=True)
66 title = models.CharField(verbose_name='标签名称', max_length=32)
67 blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid')
68
69 class Article2Tag(models.Model):
70 """
71 文章与标签的分类表(中介模型)
72 """
73 nid = models.AutoField(primary_key=True)
74 article = models.ForeignKey(verbose_name='文章', to="Article", to_field='nid')
75 tag = models.ForeignKey(verbose_name='标签', to="Tag", to_field='nid')
76
77 class UserInfo(AbstractUser): # settings: AUTH_USER_MODEL = "blog.UserInfo"
78 """
79 用户信息
80 """
81 nid = models.BigAutoField(primary_key=True)
82 nickname = models.CharField(verbose_name='昵称', max_length=32,null=True)
83 telephone = models.CharField(max_length=11, blank=True, null=True, unique=True, verbose_name='手机号码')
84 avatar = models.FileField(verbose_name='头像', upload_to='avatar', default="avatar/default.png")
85 create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
86
87 class Blog(models.Model):
88 """
89 站点信息
90 """
91 nid = models.BigAutoField(primary_key=True)
92 title = models.CharField(verbose_name='个人博客标题', max_length=64)
93 site = models.CharField(verbose_name='个人博客后缀', max_length=32, unique=True)
94 theme = models.CharField(verbose_name='博客主题', max_length=32)
95
96 user = models.OneToOneField(to='UserInfo', to_field='nid')
97
98 关联表的添加记录操作:
99 1、创建一篇文章对象:
100 user_obj = models.UserInfo.objects.get(nid=1)
101 category_obj = models.Category.objects.get(nid=2)
102
103 -------------------------一对多关系绑定----------------------------------------
104 非连表操作:
105 models.Article.objects.create(nid=5,title="自 嘲",user="鲁迅",category="诗歌")
106 连表操作
107 方法一:
108 article_obj = models.Article.objects.create(nid=5,title="自 嘲",user=user_obj,category=category_obj)
109
110 方法二:
111 article_obj = models.Article.objects.create(nid=5,title="自 嘲",user_id=1,category_id=2)
112
113 -------------------------多对多关系绑定-----------------------------------------
114 如果没有中介模型,ORM会帮忙建立如下字段的关系表:
115 tags = models.ManyToManyField("Tag")
116 """
117 nid article_id tag_id
118 1 5 1
119 2 6 2
120 3 2 1
121 """
122 给article_obj绑定kw1,kw2的标签
123 tag1 = Tag.objects.filter(title=kw1).first()
124 tag2 = Tag.objects.filter(title=kw2),first()
125
126 article_obj.tags.add(tag1,tag2)
127 article_obj.tags.add(*[tag1,tag2])
128 article_obj.tags.add(1,2)
129 article_obj.tags.add(*[1,2])
130
131 解除关系:
132 article_obj.tags.remove(tag1,tag2)
133 article_obj.tags.clear()
134
135 重置关系:
136 article_obj.tags.clear()
137 article_obj.tags.add(tag1,tag2)
138 article_obj.tags.set(tag1,tag2)
139
140 如果有中介模型:
141 tags = models.ManyToManyField(
142 to="Tag",
143 through='Article2Tag',
144 through_fields=('article', 'tag'),
145 )
146 class Article2Tag(models.Model):
147 nid = models.AutoField(primary_key)
148 article = models.ForeignKey(verbose_name="文章",to="Article",to_field="nid")
149 tag = models.ForeignKey(verbose_name=" 标签",to="Tag",to_field="nid")
150 绑定多对多的关系,有中介模型不能再使用article_obj.tags.add(),remove()等方法
151 只能用Article2Tag表进行实例对象
152
153 实例:给article_obj绑定kw1,kw2的标签
154 models.Article2Tag.objects.create(tag_id=1,article_id=5)
155 models.Article2Tag.objects.create(tag_id=2,article_id=5)
156
157 关联表的查询记录操作:
158 基于对象查询一对多的查询(子查询):
159 实例一:查询主键为4的文章的分类名称(正向查询,按字段):
160 article_obj = models.Article.objects.get(nid=4)
161 print(article_obj.category.title)
162 SQL:select category FROM "blog_article" where "blog_article"."nid"=4;
163
164 实例二:查询用户Bing发表过的所有文章(反向查询,表名_set):
165 Bing = models.UserInfo.objects.get(username="Bing")
166 book_list = models.Bing.article_set.all() # 返回值为QuerySet集合
167 for i in book_list:
168 print(i.title)
169
170 基于对象查询多对多的查询(正向查询,按字段):
171 实例三:查询主键为4的文章的标签名称:
172 article_obj = models.Article.objects.get(nid=4)
173 tag_list = article_obj.tags.all() # 是通过Article2Tag找到tag表中关联的tag记录
174
175 for i in tag_list:
176 print(i.title)
177
178 实例四:查询web开发的这个标签对应的所有文章(反向查询,按表名_set):
179 tag_obj = models.Tag.objects.get(title="web开发")
180 article_list = tag_obj.article_set.all()
181 for i in article_list:
182 pritn(i.title)
183
184 实例五:查询web开发的这个标签对应的所有文章对应的名字:
185 tag_obj = models.Tag.objects.get(title="web开发")
186 article_list = tag_obj.article_set.all()
187 for i article_list:
188 print(i.user.username)
189
190 基于QuerySet跨表查询(正向查询,按字段;反向查询按表名):
191 一对多的查询:
192 实例一:查询主键为4的文章的分类名称:
193 models.Article.objects.filter(nid=4).values("category__title")
194 models.Category.objects.filtere(article__nid=4).values("title")
195
196 实例二:查询用户Bing发表过的所有文章
197 models.UserInfo.objects.filter(username="Bing").values(article__title)
198 models.Article.objects.filter(user__username="yuan").values("title")
199
200 实例三:查询主键为4的文章的标签名称:
201 models.Article.objects.filter(nid=4).values("tags__title")
202 models.Tag.objects.filter(article__nid=4).values("title")
203
204 实例四:查询web开发的这个标签对应的所有文章
205 models.Article.objects.filter(tag__title="web开发").values("title")
206 models.Tag.objects.filter(title="web开发").values("article__title")
207
208 实例五:查询web开发的这个标签对应的所有文章对应的名字:
209 models.Tag.objects.filter(title="web开发").values(article__user__username)
210 models.UserInfo.objects.filter(Article__tags__title="web开发").values("username")