Python Web 框架-Django day05

目录

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.name
            class 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.title
            class 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

猜你喜欢

转载自blog.csdn.net/qq_42584444/article/details/83140996