目录

1.F查询和Q查询

2.原生的数据库操作方法

3.使用后台管理 models


day04

1.增加数据

  1. Entry.objects.create(属性=值)
    返回值:创建好的实体对象

  2. 创建实体对象,通过save()完成保存
    obj = Entry(属性=值)
    obj.save()

  3. 通过字典构建实体对象,通过save()完成保存
            dic = {
                '属性':'值',
            }

    obj = Entry(**dic)
            obj.save()

2.查询数据

  1. 所有的查询操作都要基于Entry.objects

    1. all()
      将每个实体对象保存在列表中进行返回
    2. values('列1',...)
      将每个实体对象转换成字典再保存在列表中进行返回

    3. values_list('列1',...)
      将每个实体对象转换成元组再保存在列表中进行返回
    4. get(条件)
      查询只返回一条数据

    5. filter(条件)

      1. 构建等值条件

        Entry.objects.filter(id=1)

      2. 构建不等值条件

        使用 查询谓词(Field Lookups)

        __gt,__ gte,__ lt,__ lte,__ contains,__ startswith,__ endnds,__ in,__ range,__ exact,__ date,__ month

    6. exclude(条件)
      实现不等值条件判断

    7. order_by('列','列')
      排序,默认是升序,降序的话则在列前加 "-"

    8. aggregate()

      不带分组,整表做聚合

      Entry.objects.aggregate(名=聚合函数('列'))

      聚合函数:
      Avg() ,Sum() ,Count(), Max(), Min()

    9. annotate()
      带分组的聚合

      Entry.objects.filter(条件).values('分组列').annotate(名=聚合函数('列')).filter(条件)

3.修改数据

  1. 修改单条数据

    1. obj=Entry.objects.get()


    2. obj.xxx = xxx
    3. 保存
      obj.save()
  2. 修改多条数据

    调用QuerySet的update()实现批量修改

    Entry.objects.filter(id=1).update(name='xxx')

4.数据删除
调用实体对象/QuerySet的 delete() 完成删除


1.F查询和Q查询

  1. F()
    作用:在执行中获取某列的值
    更新Author中所有人的age都 + 10

    SQL:update author set age=age+10
    Django: Author.objects.all().update(age=age+10) 错误

    语法:
      from django.db.models import F
      F('列名'):允许取出该列的值
      Author.object.all().update(age=F('age')+10)

  2. Q()
    作用:在查询条件中可以完成 or 操作
    语法:
      from django.db.modles import Q
      Q(条件)|Q(表达式)
    ex:查询Author中id为1 或 年龄 为48 的人的信息
    Author.objects.filter(Q(id=1)|Q(age=48))
    SQL: select * from author where id=1 or age=48;

2.原生的数据库操作方法

  1. 查询
    函数:raw(sql语句)
    语法:Entry.objects.raw(sql)
    返回:QuerySet
  2. 增删改
    from django.db import connection
    def doSQL(request):
      with connection.cursor() as cursor:
      sql = "delete from ..."
      cursor.execute(sql)
      return ' '

3.使用后台管理 models

  1. 后台的配置
    登录地址:http://localhost:8000/admin
    创建后台管理员
    ./manage.py createsuperuser
    Username:输入用户名,默认为系统账户名
    Email Address:电子邮件
    Password:密码
    Password(agian):重复密码
  2. 基本管理
    1. 在应用中的 admin.py 中注册要管理的数据

      1. admin.py
        作用:注册需要管理的Models类,只有在此注册的Models类才允许被管理
      2. 注册Models
        from .models import *
        admin.site.register(Entry)
        admin.site.register(Entry)
    2. 通过Models类的内部类 Meta 来定义展现形式
      class Author(models.Model):
        ... ...
        class Meta:

      1. db_table
        指定该实体类映射到表的名称
        (该属性设置完成后需要同步回数据库)
      2. verbose_name
        定义实体类在 admin 中显示的名字(单数)
      3. verbose_name_plural
        定义实体类在 admin 中显示的名字(复数)
      4. ordering
        指定数据在后台管理中的排序方式,取值是一个列表,将排序的列表示在列表,默认升序,降序使用 -
    3. 练习:
      1. 修改Publisher 的后台管理

        1. 更改表名为 publisher
        2. 修改展示名称为 出版社
        3. 修改每个属性对应的中文名称
          class Publisher(models.Model):name = models.CharField(max_length=30,verbose_name='名称')address = models.CharField(max_length=200,verbose_name='地址')city = models.CharField(max_length=50,verbose_name='城市')country = models.CharField(max_length=50,verbose_name='国家')website = models.URLField(verbose_name='网站')def __str__(self):return self.nameclass Meta:db_table = 'publisher'verbose_name = '出版社'verbose_name_plural = verbose_name
          
      2. 修改Book的后台管理
        1. 更改表名为book
        2. 修改展示名为 书籍
        3. 指定排序 - 按出版时间降序排序
        4. 修改每个属性对应的中文名称
          class Book(models.Model):title = models.CharField(max_length=50,verbose_name='名称')publicate_date = models.DateField(verbose_name='出版时间')def __str__(self):return self.titleclass Meta:db_table = 'book'verbose_name_plural = '书籍'ordering=['-publicate_date']
  3. 高级管理
    1. 在 admin.py 中 创建高级管理类并注册

      1. 定义 EntryAdmin 类,继承自 admin.ModelAdmin
        class AuthorAdmin(admin.ModelAdmin):
          pass
      2. 注册高级管理类
        admin.site.register(Entry,EntryAdmin)
    2. 允许在EntryAdmin中增加的属性
      1. list_display
        作用:定义在 列表页 上显示的字段们
        取值:由属性名组成的元组或列表
      2. list_display_links
        作用:定义在列表页中也能够连接到详情页的字段们
        取值:同上
        注意:取值必须要出现在list_display中
      3. list_editable
        作用:定义在列表页中就允许修改的字段们
        取值:同上
        注意:取值必须出现在list_display中但不能出现在list_display_links中
      4. search_fields
        作用:添加允许被搜索的字段们
        取值:同上
      5. list_filter
        作用:列表页的右侧增加过滤器,实现快速筛选
        取值:同上
      6. date_hierarchy
        作用:列表页的顶部增加时间选择器,取值必须是DateField 或 DateTimeField的列名
      7. fields
        作用:在详情页中,指定显示哪些字段并按照什么样的顺序显示
        取值:由属性名组成的元组或列表
      8. fieldsets
        作用:在详情页面中,对字段们进行分组显示的
        注意:fieldsets 与 fields 是不能共存的
        取值:
        fieldsets = (
            #分组1
            ('分组名称',{
                'fields':('属性1','属性2'),
                'classes':('collapse',),
            }),
            #分组2
            ()

        )

        练习:完成publisher的高级管理功能

        1. 在列表页显示name,address,city,website属性
        2. address 和 city是可编辑的
        3. 右侧增加过滤器,允许按照address和city进行筛选
        4. 顶部增加搜索框,允许按照name和website 进行搜索
        5. 详情页中分组显示
          1. name,address,city为‘基本选项’
          2. country,website 为‘高级选项’并可以折叠
            class PublisherAdmin(admin.ModelAdmin):list_display = ('name','address','city','website')list_editable = ('address','city')list_filter = ('address','city')search_fields = ('name','website')fieldsets = (('基本选项',{'fields':('name','address','city'),}),('高级选项',{'fields':('country','website'),'classes':('collapse',),}))
  4. 关系映射
    1. 一对一映射

      1. 语法
        在关联的两个类中的任何一个类中:
          属性=models.OneToOneField(Entry)

        class Author(models.Model):
          ... ...

        class Wife(models.Model):
          ... ...

        #增加对Author的一对一引用
          author = models.OneToOneField(Author)

        在数据库中:
          生成一个外键(author_id)列在 wife 表中,要引用自author 表中的主键

        在 Author 的实体中:
          增加一个隐式属性叫wife

      2. 查询
        1. 正向查询:直接通过关联属性查询即可
          通过 wife 找 author
          wife = Wife.objects.age(id=1)
          author = wife.author
        2. 反向查询:通过反向引用属性查询
          通过 author 找 wife
          author = Author.objects.get(id=1)
          wife = author.wife
    2. 一对多映射
      1. 语法
        在‘多’实体中增加对‘一’实体中的引用
        属性 = models.ForeignKey(Entry)

        ex:
          Book (多) 和 Publisher (一) 实现一对多关联

        class Publisher(models.Model):
          ... ...

        class Book(models.Model):
          ... ...
          
          publisher = models.ForeignKey(Publisher)

      2. 查询
        1. 正向查询:通过Book查询Publisher
          book = Book.objects.get(id=1)
          publisher = book.publisher
        2. 反向查询: 
          Django默认会在publisher中增加book_set属性,来表示对应的所有书籍的查询对象

          pub = Publisher.objects.get(id=1)
          books = pub.book_set.all()

    3. 多对多映射
      1. 语法
        在关联的两个类的任意一个类中,增加:
        属性 = models.ManyToManyField(Entry)

        class Author(models.Model):
          ... ...

        class Book(models.Model):
          ... ...

        authors = models.ManyToManyField(Author)

      2. 查询
        1. 正向查询:通过Book查询 Author
          Author 属性只是提供了对关联表的一个查询引用,使用all(),values() 等方法获取最终数据
          ex:
            book = Book.objects.get(id = 1)
            authors = book.authors.all()
        2. 反向查询:
          ex:
            author = Author.objects.get(id = 2)
            books = author.book_set.all()

详细笔记,请查阅

3vr5

Python Web 框架-Django day05相关推荐

  1. Python Web框架Django学习(二)

    python web框架Django学习(二) 目录:  三.Django创建APP  四.创建登录页面,实现用户交互,后台管理用户(非数据库方式) ========================= ...

  2. Python web框架Django学习(1)

    2019独角兽企业重金招聘Python工程师标准>>> 1.Django简介 (1)Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多成功的 ...

  3. Python Web框架 Django项目搭建与测试详解

    Django项目搭建 0. 项目准备: python:(目前更新到3.9了),下载地址: 点此下载python https://www.python.org/downloads/ python解释器: ...

  4. 基于Python web框架Django+Bootstrap的房源推荐系统

    哈喽,大家好呀,本次给大家推荐一个房源推荐系统,以成都市的某几个区的数据为例,仿链接平台,主要业务逻辑是: 1)将链家的数据爬取下来存储为Json文件 2)Json文件向前端JavaScript传递参 ...

  5. Python Web框架Tornado的异步处理代码演示样例

    1. What is Tornado Tornado是一个轻量级但高性能的Python web框架,与还有一个流行的Python web框架Django相比.tornado不提供操作数据库的ORM接口 ...

  6. python web框架互相融合, Pyramid或取代Django

    Django用久了,难免会感觉到自由度不够.不可否认,这种自由度的牺牲能够带来一些好处.比如,一体化的框架(full-stack framework)能够提供全面的solution,你不需要再为cac ...

  7. python搭建django框架,Python之Web框架Django项目搭建全过程

    Python之Web框架Django项目搭建全过程 IDE说明: Win7系统 Python:3.5 Django:1.10 Pymysql:0.7.10 Mysql:5.5 注:可通过pip fre ...

  8. python twisted和flask_浅谈Python Web 框架:Django, Twisted, Tornado, Flask, Cyclone 和 Pyramid...

    Django 是一个高级的 Python Web 框架,支持快速开发,简洁.实用的设计.如果你正在建一个和电子商务网站相似的应用,那你应该选择用 Django 框架.它能使你快速完成工作,也不必担心太 ...

  9. [Link]选择一个 Python Web 框架:Django vs Flask vs Pyramid

    选择一个 Python Web 框架:Django vs Flask vs Pyramid

最新文章

  1. 使用 MSBuild 和 Windows Installer XML 执行自动发布(转)
  2. C#——实现IComparable接口、IComparableT 接口、IComparer接口、IComparerT 接口和ComparerT 类DEMO
  3. Android Studio 使用Log
  4. CentOS7桌面版系统使用的一些小技巧
  5. ubuntu中执行jupyter格式代码
  6. AssertJ断言系列一
  7. 最大似然估计_机器学习最大似然估计
  8. PCM data flow - 1 - Overview
  9. Class.isAssignableFrom instanceof 区别
  10. Visio使用注意事项
  11. H3C/ 华为 路由交换基础知识官方 PPT
  12. JADE学习笔记1:JADE简介与配置
  13. 《2018版-业余无线电(相关频率)对照表》
  14. 你绝没看如此详细的PDF去水印教程
  15. 世预赛:12强赛首战国足0-3不敌澳大利亚,下一场面对日本队国足会如何调整?
  16. MD5、SHA、AES、Rabit 、RC4、TripleDES Ripemd160 加密解密工具
  17. 16秋南开计算机应用答案,南开16秋学期《计算机应用基础》在线作业.doc
  18. Office服务器意外响应,Office 所有使用过程中未响应,崩溃,意外关闭
  19. 织梦DEDECMS 整合Kindeditor编辑器美化版nkeditor版可H5多图上传摒弃SWF上传
  20. Elasticsearch+X-pack和Java Transport方式连接

热门文章

  1. PPT计算机基础知识,计算机基础知识(精美版).ppt
  2. 《网上赚钱葵花宝典1.0完整版》
  3. 公安警务指挥一张图三维电子沙盘可视化地理信息大数据系统
  4. Lattice CrosslinkNx LIFCL-40应用连载6:搭建HDMI(DVI)发送系统
  5. 手机和单反变焦的区别 安卓相机
  6. .NET 横向打印,自定义纸张的横向打印
  7. C#中的反射原理及应用
  8. 简介NXP的车规级MCU之KEA系列
  9. python有一分数序列求前20项和答案_求分数序列前20项和matlab
  10. 5 分钟上手 Material 主题编辑器