python学习第6天---django框架---模型类及数据库操作

python学习第6天---django框架---模型类及数据库操作

目录


内容

1、字段与选项

  django中字段属性对应数据库表中字段属性,参数对应表中字段约束。

  • 格式:

      name(字段名称) = models.Type(param, *argv, **keywords)
    
    • name:字段名称
    • Type: 为字段类型
      • param:参数,即为约束条件
  • 常用字段属性和参数表格说明1-1:

nameparam默认值说明
BooleanFieldFalse布尔字段,值为True或False
CharFieldmax_length=‘’字符串,参数max_length表示最大字符个数
TextField大文本字段,一般超过4000个字符时使用
IntegerFieldmax_length整数字段
DecimalFieldmax_digits=,decimal_places=十进制定点浮点数,max_digits为总位数,decimal_places为小数点后位数
DateFieldauto_now=,auto_now_addFalse日期字段,auto_now表示自动添加当前时间戳,auto_now_add表示修改时更新为当前时间戳,2个字段互斥,不能同时使用
  • 常用字段属性和参数表格说明1-2:
namedefaultdescription
defaultFalse默认值
db_indexFalse索引
db_column设置字段名称与表字段对应
nullFalse空值,数据库空值
blankFalse空,用于表单提交验证

2、查询函数

  • 常用查询函数表格2-1:
函数名功能返回值说明
get返回表中满足条件的一个且只能有一条数据一个模型类对象1)查到多条数据,抛MultipleObjectsReturned异常 2)查询不到数据,抛DoesNotExist异常
all返回表中所有数据QuerySet结果集查询集
filter返回表中满足条件的数据QuerySet参数为查询条件
exclude不满足条件的数据QuerySet参数查询条件
order_by对结果进行排序QuerySet参数写根据那些字段排序
  • filter:

    • 条件格式: 模型类属性名__条件名=值

      • 示例:查询图书评论为34的图书信息

      • 代码2-1:

          In [5]: books = Book.objects.filter(comment_volume=34)
          In [6]: print(books)
          <QuerySet [<Book: Book object (1)>]>
        
    • 条件类型

      • 判等:exact,默认可以省略
      • 模糊查询:
        • contains:是否包含某个值

          • 示例:查询书名包含’传’的图书

          • 代码2-2:

              In [3]: books1 = Book.objects.filter(name__contains='传')
              In [5]: for book in books1:
             ...:     print(book)
             ...: 
              射雕英雄传
            
        • startswith:是否以…开头

        • endswith:是否以…结尾

      • 空查询:isnull
      • 范围查询:in
        • 示例:查询id为1或者3的图书信息

        • 代码2-3:

            In [2]: books2 = Book.objects.filter(id__in=[1,3])
          
            In [3]: for book in books2:
               ...:     print(book)
               ...: 
            射雕英雄传
            笑傲江湖
          
  • order_by

    • 默认升序

      • 示例:查询所有图书信息,按照ID从小到大排序

      • 代码:

          In [2]: books1 = Book.objects.all().order_by('id')
        
          In [3]: for book in books1:
             ...:     print(book)
             ...: 
          1       射雕英雄传
          2       天龙八部
          3       笑傲江湖
          4       雪山飞狐
          5       书剑恩仇录
        
    • 降序:既在排序字段前面加上‘-’

      • 示例:查询所有图书信息,按照ID从小到大排序

      • 代码:

          In [2]: books1 = Book.objects.all().order_by('-id')
        
          In [3]: for book in books1:
             ...:     print(book)
             ...: 
          5       书剑恩仇录
          4       雪山飞狐
          3       笑傲江湖
          2       天龙八部
          1       射雕英雄传
        
  • F对象:用于类属性直接的比较

    • 示例:查询阅读量大于评论量的图书

    • 代码

        In [6]: books2 = Book.objects.filter(reading_volume__gt=F('comment_volume'))
      
        In [7]: for book in books1:
           ...:     print('%s\t%s\t%s' %(book.name, book.reading_volume, book.comment_volume))
           ...: 
        雪山飞狐        58      24
      
  • Q对象:用于查询时条件之间的逻辑关系

    • 示例:查询id大于2且评论量大于30的图书

    • 代码:

        In [6]: books2 = Book.objects.filter(Q(id__gt=2)&Q(reading_volume__gt=30))
      
        In [7]: for book in books2:
           ...:     print('%s\t%s\t%s' %(book.id, book.name, book.reading_volume))
           ...: 
        4       雪山飞狐        58
      
  • 聚合函数:查询结果为字典类型

    • max:最大值

      • 示例:查询评论量最大的图书

      • 代码:

          In [8]: book3 = Book.objects.aggregate(Max('comment_volume'))
          In [11]: print(book3)
          {'comment_volume__max': 80}
        
    • min:最小值

    • avg:平均值

    • sum:求和

    • count:数量

3、查询集

  • 查询集特性:

    • 惰性查询:只有在实际使用查询集中数据的时候,才会对数据库进行查询
    • 缓存:当使用的是同一个查询集时,只有第一使用数据集中数据的时候,会进行数据库查询。当再次使用的时候,不在去数据库查询,直接使用缓存结果。
  • 限制查询集:

  可以对一个查询集进行取下标或者切片。进行切片操作会产生一个新的查询集,下标不允许为负数

4、模型类之间的关系

4.1、对应关系

&emps; 同表之间对应关系一样,模型类之间也有三种对应关系:

  • 一对一关系
      • 关系建立:models.OneToOneField(选项)设置任一模型类中
  • 一对多关系
    • 关系建立:models.ForeignKey(选项)设置在多类中
  • 多对多关系
    • 关系建立:models.ManyToManyField(选项)设置在任一模型类中

4.2、关联查询

  • 查询规则图示4.2-1:在这里插入图片描述

    • 1:查询图书id为1的所有英雄信息

      • 代码:

          In [13]: heros1  = Hero.objects.filter(book_id=1)
          In [14]: for hero in heros1:
          	...:     print('%s\t%s\t\%s' %(hero.id, hero.name, hero.remark))
          	...: 
          1       郭靖    \降龙十八掌
          2       黄蓉    \打狗棍法
          3       黄药师  \弹指神通
          4       欧阳锋  \蛤蟆功
          5       梅超风  \九阴白骨爪
        
    • 2:查询英雄id为1的所属图书信息

      • 代码:

          In [18]: book1 = Book.objects.get(hero__id=1)
        
          In [19]: print('%s\t%s' %(book1.id, book1.name))
          1       射雕英雄传
        

5、模型管理器类

5.1、简介

  Book.objects,其中objects为django框架自动生成的管理器对象,通过这个管理器可以实现对数据的查询。

5.2、自定义模型管理器类

  1. 自定义管理器类需要继承models.Manager类
  2. 在在具体的模型类中定义一个自定义模型管理器对象

5.3、应用场景

  1. 改变查询的结果集
  2. 添加额外的方法

5.4、实例

  • 需求1:我们想要查询所有图书室,只显示在售图书。
  • 需求2:我们想要一个api完成数据库中图书信息的添加
  • 代码5.4-1:
	from django.db import models


# Create your models here.
class BookManager(models.Manager):
    """图书管理器类"""

    # 1、改变查询结果集
    def all(self):
        '''自定义all方法'''
        books = super().all()
        books.filter(isDelete=False)
        return books

    # 2、封装函数:操作模型类对应的数据表
    def create_book(self, name):
        '''向book表添加新图书'''
        # book = Book()
        model_class = self.model
        model_class.name = name
        model_class.save()
        return model_class


class Book(models.Model):
    """图书模型类"""
    # 图书名称
    name = models.CharField(max_length=20)
    # 出版日期
    publishing_date = models.DateField(auto_now_add=True)
    # 阅读量
    reading_volume = models.IntegerField(default=0)
    # 评论量
    comment_volume = models.IntegerField(default=0)
    # 删除标记
    isDelete = models.BooleanField(default=False)
    # 图书管理器对象
    objects = BookManager()

    class Meta:
        db_table = 'book_book'

    # def __str__(self):
    #     return str(self.id) + '\t' + self.name


class Hero(models.Model):
    """图书中英雄模型类"""
    # 英雄姓名
    name = models.CharField(max_length=20)
    # 性别
    gender = models.BooleanField(default=False)
    # 备注
    remark = models.CharField(max_length=32)
    # 删除标记
    isDelete = models.BooleanField(default=False)
    # 关联关系,一对多:多
    book = models.ForeignKey(Book, models.CASCADE)

    class Meta:
        db_table = 'book_hero'


class Area(models.Model):
    """地区模型类"""
    # 地区名称
    name = models.CharField(max_length=20)
    # 地区自关联,一对多
    parent = models.ForeignKey('self', models.CASCADE, null=True, blank=True)

    class Meta:
        db_table = 'book_area'

  • 测试
    Book.objects.create_book(‘神雕侠侣’)
    Book.objects.all()查询结果:

      In [4]: book1 = Book.objects.create_book('神雕侠侣')
    
      In [5]: books = Book.objects.all()
    
      In [6]: for book in books:
         ...:     print('%s\t%s\t%s' %(book.id, book.name, book.isDelete))
         ...: 
      1       射雕英雄传      False
      2       天龙八部        False
      3       笑傲江湖        False
      4       雪山飞狐        False
      5       书剑恩仇录      True
      6       神雕侠侣        False
    

6、元选项

  需要在模型类中定义一个元类Meta,在里面定义类属性db_table就可以指定表名,默认表名为应用名称_模型名。

  • 常用元选项:指定表名,源代码见上面5.4-1,指定表名,然后数据迁移之后,表名图示6-1:在这里插入图片描述

后记

  本项目为参考某音python系列视频。上面为自己参考写的学习笔记,持续更新。欢迎交流,本人QQ:806797785

  1. 原视频地址:https://space.bilibili.com/277754748?spm_id_from=333.788.b_765f7570696e666f.1
  2. 笔记项目源代码地址:https://gitee.com/gaogzhen/python
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gaog2zh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值