zoukankan      html  css  js  c++  java
  • Djaong 数据库查询

    查询演示所用到的模型类代码

    class BookInfo(models.Model):
        btitle = models.CharField(max_length=50, verbose_name='标题')
        bpub_date = models.DateTimeField(default=datetime.now, verbose_name='发布日期')
        bread = models.IntegerField(default=0, verbose_name='阅读量')
        bcomment = models.IntegerField(default=0, verbose_name='评论量')
        is_delete = models.BooleanField(default=0, verbose_name='是否删除')
    
        class Meta(object):
            db_table = 'book_info'
            verbose_name = '书籍信息'
            verbose_name_plural = '书籍信息息'
    
        def __str__(self):
            return self.btitle
    
    
    # 定义英雄模型类HeroInfo
    class HeroInfo(models.Model):
        GENDER_CHOICES = (
            (0, 'male'),
            (1, 'female')
        )
        hname = models.CharField(max_length=20, verbose_name='名称')
        hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
        hcomment = models.CharField(max_length=200, null=True, verbose_name='描述信息')
        hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书')  # 外键
        is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
    
        class Meta:
            db_table = 'heros'
            verbose_name = '英雄'
            verbose_name_plural = verbose_name
    
        def __str__(self):
            return self.hname
    

    字段选项简单说明

    verbose_name = 后台管理界面字段显示的名字
    
    # on_delete = models.CASCADE 
    # 在设置外键时,需要通过on_delete选项指明主表删除数据时,对于外键引用表数据如何处理,在django.db.models中包含了可选常量:
    
    1. CASCADE 级联,删除主表数据时连通一起删除外键表中数据
    2. PROTECT 保护,通过抛出ProtectedError异常,来阻止删除主表中被外键应用的数据
    3. SET_NULL 设置为NULL,仅在该字段null=True允许为null时可用
    4. SET_DEFAULT 设置为默认值,仅在该字段设置了默认值时可用
    

    增删改

    ----------------基本查询------------------------
    
    # get() 获取一个数据,若多个或不存在会抛出异常
    HeroInfo.objects.get(hcomment='弹琴')
    
    # all() 查询多个结果,返回一个类列表
    HeroInfo.objects.all()
    
    # count 查询结果数量
    HeroInfo.objects.all().count()
    
    ----------------过滤查询(条件查询)------------------------
    
    # filter过滤查询,返回一个类列表
    # 格式: 属性名称__比较运算符=值
    HeroInfo.objects.filter(hgender=1)
    
    # contains 是否包含(模糊查询)
    查询hcomment字段中包含 九 的所有对象
    HeroInfo.objects.filter(hcomment__contains='九')
    
    # 查询是字段否为空(null)
    # 查询btitle字段中值不为空的所有对象
    BookInfo.objects.filter(btitle__isnull=False)
    
    # in
    # 查询编号为1或3或5的图书
    BookInfo.objects.filter(id__in=[1, 3, 5])
    
    # 比较查询
    gt 大于 (greater then)
    gte 大于等于 (greater then equal)
    lt 小于 (less then)
    lte 小于等于 (less then equal)
    BookInfo.objects.filter(id__gt=3)
    # 查询bread字段值大于等于20并且bcomment字段值大于40的对象
    BookInfo.objects.filter(bread__gte=20,bcomment__gt=40)
    
    
    # 不等于(不包含)查询
    # 查询id等于3的所有图书
    BookInfo.objects.exclude(id=3)
    
    # startswith、endswith:以指定值开头或结尾
    查询btitle字段中以 部 结尾的所有对象
    BookInfo.objects.filter(btitle__endswith='部')
    
    # 日期查询
    year、month、day、week_day、hour、minute、second
    # 查询bpub_date中年份为1980的所有对象
    BookInfo.objects.filter(bpub_date__year=1980)
    
    
    # F和Q对象的使用
    from django.db.models import Q
    from django.db.models import F
    
    # 查询bread字段中值大于bcomment字段的所有对象
    BookInfo.objects.filter(bread__gt=F('bcomment'))
    # 查询bread字段中值大于2备bcomment字段值的所有对象
    BookInfo.objects.filter(bread__gt=F('bcomment')*2)
    
    # 使用Q对象完成 或 逻辑查询
    # 查询bread字段中值等于等于20的,或者bcomment大于40的对象
    BookInfo.objects.filter(Q(bread__gte=20) | Q(bcomment__gt=40))
    
    # 与逻辑一般不使用Q对象,对个条件直接逗号连接即可
    BookInfo.objects.filter(bread__gte=20,bcomment__gt=40)
    
    ----------------------聚合函数-----------------------
    Avg 平均,Count 数量,Max 最大,Min 最小,Sum 求和,被定义在django.db.models中。
    
    # 使用aggregate()过滤器可以调用聚合函数
    from django.db.models import Sum,Avg,每一个过滤函数都需要导入
    
    BookInfo.objects.aggregate(Sum('bread'))
    返回一个字典{'bread__sum': 126}
    
    BookInfo.objects.aggregate(Avg('bread'))
    返回一个字典{'bread__avg': 25.2}
    
    # 排序
    BookInfo.objects.all().order_by('bread')  # 升序
    BookInfo.objects.all().order_by('-bread')  # 降序
    
    -------------------关联查询------------------------
    
    # 一对应对的查询
    # 一对应的模型类对象.多对应的模型类名小写_set 例:
    b = BookInfo.objects.get(id=1)
    b.heroinfo_set.all()
    
    # 多对应一的查询
    # 直接 对象.外键字段名
    h = HeroInfo.objects.get(id=1)
    h.hbook # 获取到 BookInfo的一个对象
    h.hbook_id # 获取到 BookInfo一个对象的id
    
    ----------------------------关联过滤查询-----------------
    
    语法: 关联模型类名小写__属性名__条件运算符=值;
          关联模型类名小写__属性名=值;表示等于
          条件运算符 在上面有详细使用说明
    
    # 查询HeroInfo中hname的值是 虚竹 的所有BookInfo的对象
    # 查询英雄名字是虚竹的的所有书籍
    BookInfo.objects.filter(heroinfo__hname='虚竹')
    
    # 查询英雄名字包含不的所有书籍
    BookInfo.objects.filter(heroinfo__hname__contains='不')
    
    # 修改
    hero = HeroInfo.objects.get(id=1)
    hero.hname = '猪悟能'
    hero.save()
    
    # 使用update修改会返回受到影响的行数,而且不必调用save()方法
    HeroInfo.objects.filter(hname='乔峰').update(hname='乔')
    
    
    
  • 相关阅读:
    Hibernate4与Spring3的不兼容问题
    关于Struts2框架下jsp获取action的布尔值问题
    js 操作select和option常见用法
    用socaket编写客户端与服务端程序相互发送消息
    Web编程
    第二篇
    java基础
    GeoServer style标注中文乱码配置
    RabbitMQ高可用方案总结
    Visual Studio 2019 注册KEY
  • 原文地址:https://www.cnblogs.com/fanlei5458/p/9235454.html
Copyright © 2011-2022 走看看