ORM知识点拾遗1

  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")

 

posted @ 2017-12-04 14:42  Justin067  阅读(83)  评论(0)    收藏  举报
TOP