Django复习之ORM
QuerySet数据类型:
                        1、可切片,可迭代      [obj,....]  
                  2、惰性查询:
               articles_list=models.Article.objects.all()
                              使用articles_list,比如if articles_list,这时转换sql语句
3、缓存机制
               articles_list=models.Article.objects.all()
               for i in articles_list:
                                        print(i.title)  # hit the database
                                 
         for i in articles_list:
                                        print(i.title)  # not hit the database
==============================================
                                 for i in models.Article.objects.all():
                                        print(i.title)  # hit the database
                                 
         for i in models.Article.objects.all():
                                        print(i.title)  #  hit the database 
      4、优化查询
               articles_list=models.Article.objects.all().iterator()
               for i in articles_list:
                                        print(i.title)  # hit the database
          
            for i in articles_list:
                                        print(i.title)  # 无结果
连表操作:
                
                表关系:
            
                       class UserInfo(AbstractUser):  # settings:   AUTH_USER_MODEL = "blog.UserInfo"
       """
       用户信息
       """
       nid = models.BigAutoField(primary_key=True)
       nickname = models.CharField(verbose_name='昵称', max_length=32,null=True)
       telephone = models.CharField(max_length=11, blank=True, null=True, unique=True, verbose_name='手机号码')
       avatar = models.FileField(verbose_name='头像', upload_to='avatar', default="avatar/default.png")
       create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
class Blog(models.Model):
       """
       站点信息
       """
       nid = models.BigAutoField(primary_key=True)
       title = models.CharField(verbose_name='个人博客标题', max_length=64)
       site = models.CharField(verbose_name='个人博客后缀', max_length=32, unique=True)
       theme = models.CharField(verbose_name='博客主题', max_length=32)
user = models.OneToOneField(to='UserInfo', to_field='nid')
class Category(models.Model):
       
       nid = models.AutoField(primary_key=True)
       title = models.CharField(verbose_name='分类标题', max_length=32)
       blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid')
class Article(models.Model):
       nid = models.BigAutoField(primary_key=True)
       title = models.CharField(max_length=50, verbose_name='文章标题')
       desc = models.CharField(max_length=255, verbose_name='文章描述')
       
                            # category字段: 与Article对象关联的category对象
       category = models.ForeignKey(verbose_name='文章类型', to='Category', to_field='nid', null=True)
       
       # user字段:与Article对象关联的user字段
       user = models.ForeignKey(verbose_name='所属用户', to='UserInfo', to_field='nid')
       
       tags = models.ManyToManyField(
        to="Tag",
        through='Article2Tag',
        through_fields=('article', 'tag'),
       )
class ArticleDetail(models.Model):
       
       nid = models.AutoField(primary_key=True)
       content = models.TextField(verbose_name='文章内容', )
article = models.OneToOneField(verbose_name='所属文章', to='Article', to_field='nid')
                        
      class Article2Tag(models.Model):
       nid = models.AutoField(primary_key=True)
       article = models.ForeignKey(verbose_name='文章', to="Article", to_field='nid')
       tag = models.ForeignKey(verbose_name='标签', to="Tag", to_field='nid')
      
      
      class Tag(models.Model):
       nid = models.AutoField(primary_key=True)
       title = models.CharField(verbose_name='标签名称', max_length=32)
       blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid')
关联表的添加记录操作:
            1、创建一篇文章对象:
         user_obj=models.UserInfo.objects.get(nid=1)
         category_obj=models.Category.objects.get(nid=2)
         
         
         #################一对多关系绑定#########################
         # 方式1:
         article_obj=models.Article.objects.create(nid=5,title="招呼亚星"....,user=user_obj,category=category_obj)
         
         # 方式2:
          article_obj=models.Article.objects.create(nid=5,title="招呼亚星"....,user_id=1,category_id=2)
         '''
             Article:
                    nid         title        user_id     category_id
                        5         招呼亚星         1              2
                         
         '''
         #################多对多关系绑定#########################
if 没有中介模型:
           tags = models.ManyToManyField("Tag")
           '''
              ORM创建的第三张表:
              Article2tags:
nid    article_id    tag_id   
                                          1         5            1
                                          2         5            2            
           
           '''
           
           实例:给article_obj绑定kw1,kw2的标签
            tag1=Tag.objects.filter(title=kw1).first()
            tag2=Tag.objects.filter(title=kw2).first()
            
            article_obj.tags.add(tag1,tag2)   #      
            article_obj.tags.add(*[tag1,tag2])    
            article_obj.tags.add(1,2)    
            article_obj.tags.add(*[1,2])  
                 
            解除关系:
             article_obj.tags.remove(tag1,tag2)
             article_obj.tags.clear()
重置关系:
              article_obj.tags.clear()
           article_obj.tags.add(tag1,tag2)  
           =====
           article_obj.tags.set(tag1,tag2)
           
           
           
           
      if 有中介模型:       
                             tags = models.ManyToManyField(
           to="Tag",
           through='Article2Tag',
           through_fields=('article', 'tag'),
          )
class Article2Tag(models.Model):  #  中介模型
         nid = models.AutoField(primary_key=True)
         article = models.ForeignKey(verbose_name='文章', to="Article", to_field='nid')
         tag = models.ForeignKey(verbose_name='标签', to="Tag", to_field='nid') 
         
                             绑定多对多的关系,有中介模型,不能再使用article_obj.tags.add(),remove()等方法;
        只能用Article2Tag表进行实例对象。
        
        
        
        实例:给article_obj绑定kw1,kw2的标签:
        
         models.Article2Tag.objects.create(tag_id=1,article_id=5)
         models.Article2Tag.objects.create(tag_id=2,article_id=5)
         
      
    关联表的查询:
                         
                        基于对象查询(子查询):
          
       一对多的查询:
       
        实例1:查询主键为4的文章的分类名称(正向查询,按字段)
            
            article_obj=models.Article.objects.get(nid=4)
            print(article_obj.category.title)
        
            SELECT * FROM "blog_article" WHERE "blog_article"."nid" = 4;  // category_id=2
            SELECT * FROM "blog_category" WHERE "blog_category"."nid" = 2;
实例2:查询用户yuan发表过的所有的文章(反向查询,表名_set)
               yuan=models.UserInfo.objects.get(username="yuan")
            book_list=yuan.article_set.all()  # QuerySet 
                  
              
        
       多对多的查询:
                                
                                 实例3:查询主键为4的文章的标签名称(正向查询,按字段)  
          article_obj=models.Article.objects.get(nid=4)        
          tag_list=article_obj.tags.all()   #  是通过Article2Tag找到tag表中关联的tag记录
          for i in tag_list:
            print(i.title)
           
         实例4:查询web开发的这个标签对应的所有的文章(反向查询,按表名_set)
                                    tag_obj=models.Tag.objects.get(title="web开发")
         article_list=tag_obj.article_set.all()
         for i in article_list:
          print(i.title)       
             
            实例5:查询web开发的这个标签对应的所有的文章对应的作者名字
                                      tag_obj=models.Tag.objects.get(title="web开发")
           article_list=tag_obj.article_set.all() 
                                      for article in article_list:
             print(article.user.username)                                     
             
             
             
             
             
             
             
      基于QuerySet跨表查询  正向查询,按字段 ;反向查询,按表名(join查询)
      
        一对多的查询:
       
        实例1:查询主键为4的文章的分类名称
            
           models.Article.objects.filter(nid=4).values("category__title")   
                                      models.Category.objects.filter(article__nid=4).values("title")
           
        实例2:查询用户yuan发表过的所有的文章
            models.UserInfo.objects.filter(username="yuan").values(article__title)
            models.Article.objects.filter(user__username="yuan").values("title")
           
        
        多对多的查询:
         
          实例3:查询主键为4的文章的标签名称(正向查询,按字段)  
           models.Article.objects.filter(nid=4).values("tags__title")
           models.Tag.objects.filter(article__nid=4).values("title")          
           
          实例4:查询web开发的这个标签对应的所有的文章(反向查询,按表名_set)
           models.Article.objects.filter(tags__title="web开发").values("title")
           models.Tag.objects.filter(title="web开发").values("article__title")          
             
          实例5:查询web开发的这个标签对应的所有的文章对应的作者名字
            models.Tag.objects.filter(title="web开发").values("article__user__username")
            models.UserInfo.objects.filter(article__tags__title="web开发").values("username")
           
    聚合查询与分组查询:
    
            聚合查询:
          # 查询所有书籍的平均价格
          Book.objects.all().aggregate(Avg('price'))
       
      分组查询:
                            #查询每一个出版社出版过的名字以及出版书籍个数
                            
                            sql: select publish.name,Count(book.name) from Book inner join publish on book.pub_id=publish.id 
                    group by publish.name 
           
       ORM:   models.Publish.objects.all().annotate(c=Count("book_id")).values("name","c")
Django复习之ORM的更多相关文章
- Django复习
		django复习 django和其他框架的对比 django,集成很多功能的大型框架,为开发者提供了很多方便的组件:orm.form.ModelForm.auth.admin.contenttypes ... 
- Django中的ORM进阶操作
		Django中的ORM进阶操作 Django中是通过ORM来操作数据库的,通过ORM可以很easy的实现与数据库的交互.但是仍然有几种操作是非常绕也特别容易混淆的.于是,针对这一块,来一个分类总结吧. ... 
- Python/Django(CBV/FBV/ORM操作)
		Python/Django(CBV/FBV/ORM操作) CBV:url对应的类(模式) ##====================================CBV操作============ ... 
- 在Django中使用ORM创建图书管理系统
		一.ORM(对象关系映射) 很多语言的web框架中都有这个概念 1. 为什么要有ORM? 1. 写程序离不开数据,要使用数据就需要连接数据库,但是不同的数据库在sql语句上(mysql,oracle等 ... 
- Django中的ORM框架使用小技巧
		Django中的ORM框架使用小技巧 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Django对各个数据提供了很好的支持,包括PostgreSQL,MySQL,SQLite ... 
- django中的ORM介绍和字段及字段参数
		Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ... 
- Django中的ORM介绍,字段以及字段的参数。
		Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ... 
- Django中的ORM关系映射查询方面
		ORM:Object-Relation Mapping:对象-关系映射 在MVC框架中的Model模块中都包括ORM,对于开发人员主要带来了如下好处: 实现了数据模型与数据库的解耦,通过简单的配置就可 ... 
- Django框架 之 ORM中介模型
		Django框架 之 ORM中介模型 中介模型 处理类似搭配 pizza 和 topping 这样简单的多对多关系时,使用标准的ManyToManyField 就可以了.但是,有时你可能需要关联数据 ... 
随机推荐
- hihocoder #1828 : Saving Tang Monk II(BFS)
			描述 <Journey to the West>(also <Monkey>) is one of the Four Great Classical Novels of Chi ... 
- SQL Server 中的 NOLOCK 到底是什么意思?
			以前遇到过,但仅限于听同事说加上NOLOCK好一些,今天仔细研究测试了下,终于理解了,那么加与不加到底区别在哪呢? 我先说下其区别,之后再做测试. 大家都知道,每新建一个查询,都相当于创建一个会话,在 ... 
- Centos7重置Mysql 8.0.1 root 密码
			问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码:找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc ... 
- 【协议】4、http状态码
			10.4 客户错误 4xx 状态代码4xx类是专门使用在客户看上去错误的情形下的.除非当应答一个HEAD请求时,服务器因该有一个包括错误情形的解释的实体,以及它是否一个临时或者终了的条件.这些状态编码 ... 
- 【hibernate】1、Hibernate的一个注解 @Transient
			@Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性.如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic ... 
- 阿里CentOS 7 卸载mysql5.6
			查看当前安装mysql情况 rpm -qa|grep -i mysql 执行 yum remove mysql rpm -e mysql-community-release-el7-5.noarch ... 
- PATH、CLASSPATH、CLASSPATH
			PATH: 说明: 环境变量中的path,意在在向计算机发出指令时的一个指向路径,如 一般会在path里加上:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin 其中:%JAVA_ ... 
- python爬虫入门---第一篇:获取某一网页所有超链接
			这是一个通过使用requests和BeautifulSoup库,简单爬取网站的所有超链接的小爬虫.有任何问题欢迎留言讨论. import requests from bs4 import Beauti ... 
- 【20181031】arcgis10.6破解不成功的问题
			首先需要下好正确版本的crack文件,license10.6文件夹里应该有ARCGIS.exe和service.txt两个文件,我的问题就是因为crack文件不完整,没有ARCGIS.exe文件,所以 ... 
- GitHub使用SSHkey进行连接
			SSH key的配置基本是我们使用git必备的配置,配置好可以避免频繁的在git push或者git pull的时候输入账号和密码 本来我的SSH key早就配置好了,结果他不起作用了,那就在配置一次 ... 
