Django框架基础-03
数据库新增数据
    1.save⽅法
        >>> from datetime import date
        >>> from booktest.models import BookInfo, HeroInfo
        >>> book = BookInfo(
        ... btitle='⻄游记',
        ... bpub_date=date(1989,1,1),
        ... bread=10,
        ... bcomment=20
        ... )
        >>> book.save()
    2.create⽅法
        >>> HeroInfo.objects.create(
        ... hname='⽩⻰⻢',
        ... hgender=1,
        ... hcomment='被师傅',
        ... hbook=book
        ... )
    3.⼀对多外键绑定
        1.绑定模型对象 hbook=book
        2.绑定模型对象id hbook_id=book.id

数据库查询数据
基本查询
    1.查询单⼀结果
        BookInfo.objects.get(id=3)
        BookInfo.objects.get(btitle='⻄游记')
            只能得到单⼀模型对象 多查了报错  没查到也报错 所以查询时必须try
    2.⽆条件查询所有
        BookInfo.objects.all()
            得到的是查询集(QuerySet),直到真正使⽤数据时才会去查询数据库
    3.查询数据表总量
        BookInfo.objects.count()
        BookInfo.objects.filter(btitle='⻄游记').count()

过滤查询
    1.过滤查询语法 模型类.objects.过滤器(模型属性名__条件运算符=值)
    2.过滤查询需求
        1.查询id为1的书籍 BookInfo.objects.filter(id=1)
        2.查询书名包含‘湖’的书籍 (like %湖%) BookInfo.objects.filter(btitle__contains='湖')
        3.查询书名以‘部’结尾的书籍 (endswith 、startswith)(like %部)/(like 部%) BookInfo.objects.filter(btitle__endswith='部')
        4.查询书名不为空的书籍(双重否定,代表肯定) BookInfo.objects.filter(btitle__isnull=False)
        5.查询编号为2或4的书籍 (范围内,不代表区间) BookInfo.objects.filter(id__in=[2,4])
        6.查询编号⼤于2的书籍 (lt ⼩于)(gt ⼤于)(lte ⼩于等于)(gte ⼤于等于) BookInfo.objects.filter(id__gt=2)
        7.查询id不等于3的书籍 exclude(查询满⾜条件以外的数据) BookInfo.objects.exclude(id=3)
        8.查询1980年发表的书籍 BookInfo.objects.filter(bpub_date__year='1980')
        9.查询1990年1⽉1⽇后发表的书籍 BookInfo.objects.filter(bpub_date__gt=date(1990,1,1))

F对象和Q对象
    1.F对象
        1.查询阅读量⼤于评论量的书籍 BookInfo.objects.filter(bread__gt=F('bcomment'))
        2.查询阅读量⼤于2倍评论量的书籍 BookInfo.objects.filter(bread__gt=F('bcomment')*2)
    2.Q对象
        1.查询阅读量⼤于20,或编号⼩于3的图书 BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))
        2.查询编号不等于3的书籍 BookInfo.objects.filter(~Q(id=3))
    3.逻辑与
        1.写法⼀
            BookInfo.objects.filter(bread__gt= 20,id__lt=3 )
            或
            BookInfo.objects.filter(bread__gt= 20).filter(id__lt=3 )
        2.写法⼆ BookInfo.objects.filter(Q(bread__gt= 20) & Q(pk__lt= 3 ))

聚合和排序
    1.聚合
        1.调⽤聚合函数的过滤器 aggregate()
        2.聚合函数
            聚合函数包括:Avg 平均,Count 数量,Max 最⼤,Min 最⼩,Sum 求和
            定义在django.db.models中
        3.语法 Sum('求和的模型类属性')
        4.实现 BookInfo.objects.aggregate(Sum('bread'))
        5.结果
            { '属性名__聚合类⼩写':值}
            { 'bread__sum': 136}
    2.排序 BookInfo.objects.all().order_by('bread') # 升序
        BookInfo.objects.all().order_by('-bread') # 降序

关联查询
    1.基础关联查询
        1.⼀查多:查询编号为1的图书中所有⼈物信息 book = BookInfo.objects.get(id=1)
        book.heroinfo_set.all()
    2.多查⼀:查询编号为1的英雄出⾃的书籍 hero = HeroInfo.objects.get(id=1)
        hero.hbook
    2.内连接查询
        1.多查⼀:查询书籍中⼈物的描述包含"降⻰"的书籍 BookInfo.objects.filter(heroinfo__hcomment__contains='降⻰')
        2.⼀查多:查询书名为"天⻰⼋部"的所有⼈物信息 HeroInfo.objects.filter(hbook__btitle='天⻰⼋部')

数据库修改和删除数据
    1.修改
        1.save⽅法
            hero = HeroInfo.objects.get(hname= ' 猪⼋戒' )
            hero.hname = ' 猪悟能'
            hero.save()
        2.update⽅法 HeroInfo.objects.filter(hname= ' 沙悟净' ).update(hname= ' 沙僧' )
    2.删除
        hero = HeroInfo.objects.get(id=1 )
        hero.delete()
        HeroInfo.objects.filter(id=1 ).delete()

数据库查询集
    1.概念 查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。
    2.获取查询集
        • all():返回所有数据。
        • filter():返回满⾜条件的数据。
        • exclude():返回满⾜条件之外的数据。
        • order_by():对结果进⾏排序。
    3.对查询集可以再次调⽤过滤器进⾏过滤 BookInfo.objects.filter(bread__gt= 30).order_by(' bpub_date' )
    4.两⼤特性
        1.惰性执⾏
        创建查询集不会访问数据库,直到调⽤数据时,才会访问数据库,调⽤数据的情况包括迭代、序列化、与if合⽤
        不会访问数据库 qs = BookInfo.objects.all()
        访问数据库 for book in qs:
         print(book.btitle)
        2.缓存
        使⽤同⼀个查询集,第⼀次使⽤时会发⽣数据库的查询,然后Django会把结果缓存下来,再次使⽤这个查询集时会使⽤缓存的数据,减少了数据库的查询次数。

不使⽤缓存
            [book.id for book in BookInfo.objects.all()]
            [book.id for book in BookInfo.objects.all()]
        使⽤缓存
            qs=BookInfo.objects.all()
            [book.id for book in qs]
            [book.id for book in qs]
    5.限制查询集 实现limit语句
            qs = BookInfo.objects.all()[0 : 2 ]

模型管理器
    1.概念 管理器是Django的模型进⾏数据库操作的接⼝,Django应⽤的每个模型类都拥有⾄少⼀个管理器。
    2.管理器对象objects
        是模型管理器类Manager⾃动实例化出来的对象
        ⽤于调⽤模型提供的各种⼯具⽅法
        create()
        all()
        get()
        count()
        filter()
        exclude()
        ......
    3.⾃定义管理器
        1.注意:⼀旦为模型类指明⾃定义的过滤器后,Django不再⽣成默认管理对象objects。
        2.⾃定义管理器需求 当管理器提供的功能,⽆法满⾜当前需求时,可以⾃定义管理器,扩充功能
        3.⾃定义⽅式

            class BookInfoManager(models.Manager):
             """⾃定义模型类管理器"""
                pass
            books = BookInfoManager()

Admin站点
使⽤步骤
     使⽤Django的管理模块,需要按照如下步骤操作:
    1. 管理界⾯本地化
    2. 创建管理员
    3. 注册模型类
    4. ⾃定义管理⻚⾯

1.管理界⾯本地化

    # LANGUAGE_CODE = 'en-us'
    # 简体中⽂
    LANGUAGE_CODE = 'zh-hans'
    # TIME_ZONE = 'UTC'
    # 亚洲上海时区
    TIME_ZONE = 'Asia/Shanghai'

2.创建管理员 python manage.py createsuperuser
3.注册模型类 admin.py
    admin.site.register(models.BookInfo)
4.定义模型类站点管理类
    1.⽅式⼀
        class BookInfoAdmin(admin.ModelAdmin):
         """图书模型类管理类"""
            pass
        admin.site.register(models.BookInfo, BookInfoAdmin)
    2.⽅式⼆
        @ admin.register(models.HeroInfo)
        class HeroInfoAdmin(admin.ModelAdmin):
         """英雄模型类管理类"""
            pass
    使⽤了装饰器之后,不⽤再调⽤admin.site.register()
5.调整列表⻚展示
    BookInfoAdmin
    # 默认每⻚显示的数据数量
    list_per_page = 2
    # 操作选项
    actions_on_bottom = True
    # 显示的列
    list_display = ['id', ' btitle' , 'new_pub_date']

将⽅法作为列

1.models.BookInfo类中
        def new_pub_date(self):
             """将⽇期格式化后展示"""
             return datetime.strftime( self.bpub_date, '%Y年 %m⽉ %d⽇ ' )
            new_pub_date.short_description = ' 发布⽇期' # 设置⽅法字段在admin中显示的标题
            new_pub_date.admin_order_field = ' bpub_date' # 指定排序依据
    2.将⽅法添加到要显示的列 # 显示的列
        list_display = ['id', ' btitle' , 'new_pub_date']
        HeroInfoAdmin
        # 右侧过滤栏
        list_filter = [' hbook' , ' hgender' ]
        # 顶部搜索框
        search_fields = [' hname' ]

关联对象
            1.需求 展示英雄时,将英雄所在的书的阅读量关联出来
            2.在 HeroInfo模型类中指定关联
            # 定义英雄模型类HeroInfo
            class HeroInfo(models.Model):
            ......
            def read(self):
                """将该英雄所属于的书的阅读量关联进来"""
                return self.hbook.bread
                read.short_description = ' 阅读量'
    3.添加到列
    @ admin.register(models.HeroInfo)
    class HeroInfoAdmin(admin.ModelAdmin):
     """英雄模型类管理类"""
     ......
        list_display = ['id', ' hname' , ' hbook' , 'read']
6.调整编辑⻚展示

class BookInfoAdmin(admin.ModelAdmin):
"""图书模型类管理类"""
......
# 编辑⻚⾯
# 允许展示编辑的字段分组
    fieldsets = (
    (' 基本' , {'fields': [' btitle' , ' bpub_date' , 'image']}),
    (' ⾼级' , {
    'fields': ['bread', ' bcomment' ],
    'classes': ('collapse',) # 是否折叠显示
    })
    )

关联
1.准备关联的类
    class HeroInfoStackInline(admin.StackedInline):
        model = models.HeroInfo # 要编辑的对象
        extra = 1 # 附加编辑的数量
2.添加关联
    class BookInfoAdmin(admin.ModelAdmin):
        """图书模型类管理类"""
        ......
        # 关联
        inlines = [HeroInfoStackInline]
7.调整站点全局⻚⾯信息
    1.需求
        • admin.site.site_header 设置⽹站⻚头
        • admin.site.site_title 设置⻚⾯标题
        • admin.site.index_title 设置⾸⻚标语
    2 .实现
        # 设置admin⽹⻚信息
        admin.site.site_header = ' banner'
        admin.site.site_title = ' msn'
        admin.site.index_title = ' 主页'
8.站点上传图⽚
    1.安装图⽚处理模块 pip install Pillow
    2.指定上传的⽂件存储位置
        # 指定上传的⽂件存储路径
        MEDIA_ROOT = os.path.join(BASE_DIR, 'static_files/media')
3.模型类准备image上传字段

# 定义图书模型类BookInfo
class BookInfo(models.Model):
    btitle = models.CharField(max_length= 20, verbose_name= ' 名称' )
    bpub_date = models.DateField(verbose_name= ' 发布⽇期' )
    bread = models.IntegerField(default= 0 , verbose_name= ' 阅读量' )
    bcomment = models.IntegerField(default= 0 , verbose_name= ' 评论量' )
    is_delete = models.BooleanField(default= False, verbose_name= ' 逻辑删除' )
    image = models.ImageField(upload_to= 'book', verbose_name= ' 图书图⽚' , null= True)

4.迁移 python manage.py makemigrations
    python manage.py migrate

5.image字段展示

class BookInfoAdmin(admin.ModelAdmin):
"""图书模型类管理类"""
......
# 编辑⻚⾯
# 允许展示编辑的字段分组
    fieldsets = (
    (' 基本' , {'fields': [' btitle' , ' bpub_date' , 'image']}),
    (' ⾼级' , {
    'fields': ['bread', ' bcomment' ],
    'classes': ('collapse',) # 是否折叠显示
    })
    )

相关源码连接:

github,技术交流,欢迎指教

django 基础框架学习 (三)的更多相关文章

  1. django 基础框架学习 (二)

    Django框架基础-02 Django缓存cookie 1.说明        当我们服务器在响应数据的同时,希望写⼊⼀些缓存数据到客户端        我们可以选择在响应的同时,将要写⼊到客户端的 ...

  2. django 基础框架学习 (一)

    Django-01 Web框架 1.Web应⽤程序处理流程  : 2.Web框架的意义            1.⽤于搭建Web应⽤程序            2.免去不同Web应⽤相同代码部分的重复 ...

  3. Struts2框架学习(三) 数据处理

    Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...

  4. Django基础——Model篇(三)

    一 Django ORM中的概念 ORM —— 关系对象映射,是Object Relational Mapping的简写,是用来简化数据库操作的框架 Django ORM遵循Code Frist原则, ...

  5. Android 学习笔记之AndBase框架学习(三) 使用封装好的函数完成Http请求..

    PS:踏踏实实走好每一步... 学习内容: 1.使用AndBase框架实现无参Http Get请求... 2.使用AndBase框架实现有参Http Post请求... 3.使用AndBase框架实现 ...

  6. 【JavaWeb】Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架(三)

    Spring+SpringMVC MVC呢,现在似乎越来越流行使用SpringMVC框架,我自己用的感觉,是非常好,确实很舒服,配置一开始是麻烦了一点点,但是后续的开发真的是很清爽! SpringMV ...

  7. python flask框架学习(三)——豆瓣微信小程序案例(二)整理封装block,模板的继承

    我们所要实现的效果: 点击电影的更多,跳转到更多的电影页面:点击电视剧的更多,跳转到更多的电视剧页面. 三个页面的风格相同,可以设置一个模板,三个页面都继承这个模板 1.在指定模板之前,把css放在一 ...

  8. WebGL——osg框架学习三

    今天继续来Draw绘制的osg模块的学习,昨天我们学习的是StateBin渲染状态树节点类,今天我们来继续学习下一个Draw的基础类DrawableEntity渲染对象实体类.这个类和Drawable ...

  9. Struts2框架学习(三)——配置详解

    一.struts.xml配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts ...

随机推荐

  1. Java-API-Package:org.springframework.beans.factory.annotation

    ylbtech-Java-API-Package:org.springframework.beans.factory.annotation 1.返回顶部 1. @NonNullApi @NonNull ...

  2. Hybrid App混合模式移动应用开发(AngularJS+Cordova+Ionic)

    以前公司开发了某手机APP是通过jquerymobile来实现的,发现它对手机上的原生设备无能为力.于是在下一个项目到来之际,通过筛选最终决定使用cordova+Ionic.看起来简单,但是因为他们各 ...

  3. myeclipse10启动service窗口报异常

    1:找到与之对应的tomcat: 2:删掉“.metadata/.plugins/org.eclipse.core.runtime/.settings/ com.genuitec.eclipse.as ...

  4. C语言学习笔记--#error 、 #line 和 #pragma 的使用

    1. #error 的用法 (1)#error 是一种预编译器指示字,用于生成一个编译错误消息 (2)用法:#error message //注意:message 不需要用双引号包围 (3)#erro ...

  5. spirng boot web配置开发

    spring-booter-starter-web是spring-boot web发开的核心,自动配置信息存储在spring-boot-autoconfigure.jar 下面的web目录里面,包含了 ...

  6. TextView中ellipsize属性

    TextView中可以设置一个ellipsize属性,作用是当文字长度超过textview宽度时的显示方式: 例如,"encyclopedia"显示, 只是举例,以实际显示为准:) ...

  7. 【转】nginx禁止访问某个文件和目录(文件夹)

    nginx禁止访问所有.开头的隐藏文件设置 location ~* /.* {deny all;} nginx禁止访问目录, 例如:禁止访问path目录 location ^~ /path {deny ...

  8. Linux 编译安装内核

    一.简介 内核,是一个操作系统的核心.它负责管理系统的进程.内存.设备驱动程序.文件和网络系统,决定着系统的性能和稳定性.Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新.新的内核修 ...

  9. GCD 学习(四) dispatch_group

    如果想在dispatch_queue中所有的任务执行完成后在做某种操作,在串行队列中,可以把该操作放到最后一个任务执行完成后继续,但是在并行队列中怎么做呢.这就有dispatch_group 成组操作 ...

  10. p1129 [ZJOI2007]矩阵游戏

    传送门 分析 不难想到将黑点的行列连边,然后判断最大匹配是否等于n 代码 #include<iostream> #include<cstdio> #include<cst ...