聚合/分组/Q/F/事务/orm常见字段及属性/自定义orm字段(lnh25)

本文介绍了在DjangoORM中如何使用聚合函数如Count,Sum,Max,Min,Avg进行数据统计,以及分组查询(annotate)的运用。同时,详细讲解了F查询和Q查询的用法,包括条件组合及更新操作。此外,还讨论了Django中开启事务的步骤和模型层的常见字段类型及其参数。
摘要由CSDN通过智能技术生成

聚合查询(aggregate)

# sum min max avg count
# 在orm中如何使用聚合函数
# 关键字:aggregate,我们需要在django中倒过来才能使用
   from django.db.models import Count, Sum, Max, Min, Avg
    # 求书籍表中得书的平均价格
    # res = models.Book.objects.aggregate(Avg('price'))
    # res = models.Book.objects.aggregate(Max('price'))
    res = models.Book.objects.aggregate(Count('price'),Sum('price'),Max('price'),Min('price'),Avg('price'))
    print(res)

分组查询(annotate)

# group by分组
# 分组之后只能取得分组的依据,其他的字段不能拿到
# 设置一个严格模式:sql_mode='only...' 
# annotate
######################分组查询
    from django.db.models import Count, Sum, Max, Min, Avg
    # 1.统计每一本书的作者个数
    # select *from book group by id
    # res = models.Book.objects.annotate()  # 就是安装书来分组的
    # 正反向:书----》作者-----》正向-----》外键字段
    # annotate就是对models后面的表进行分组
    # 聚合函数一般都是配合分组使用的
    # res = models.Book.objects.annotate(author_num=Count('authors__pk')).values('title', 'author_num')
    # print(res)

    #  # 2.统计每个出版社卖的最便宜的书的价格
    # 1. 按照出版社分组
    # 2. 聚合查询书的价格
    # 3. 出版社查书------------>反向查询------------》表名小写
    # res = models.Publish.objects.annotate(min_price=Min('book__price')).values('name', 'min_price')
    # print(res)

    # 3.统计不止一个作者的图书
    # 1. 统计每一本的作者个数
    # 2. 在过滤出作者个数大于1的就可以了

    # 书----》作者-----》正向-----》外键字段
    # res = models.Book.objects.annotate(author_num=Count('authors__pk')).filter(author_num__gt=1).values('title', 'author_num')
    # res只要返回的结果是queryset,就可以一直往下点 queryset提供的方法
    # res = models.Book.objects.annotate(Count('authors'))
    # print(res)

    # 4.查询每个作者出的书的总价格
    # 1. 按照作者分组
    # 2. 作者查书
    # 总价格
    # res = models.Author.objects.annotate(sum_price=Sum('book__price')).values('name', 'sum_price')
    # print(res)

F与Q查询

# 1.查询卖出数大于库存数的书籍
####################F查询
    from django.db.models import F

    # 1.查询卖出数大于库存数的书籍
    # select * from book where sale_num > kucun;
    # kucun

    # res = models.Book.objects.filter(sale_num__gt=F('kucun'))
    # print(res)

    # # 2.将所有书籍的价格提升500块
    # update app01_book set price = price+500;

    # res = models.Book.objects.update(price=F('price')+500)
    # 3.将所有书的名称后面加上爆款两个字
    # update app01_book set title = title + 'haha' ;
    from django.db.models.functions import Concat
    from django.db.models import Value
    # models.Book.objects.update(title=F('title')+'haha') # 不能这样写
    models.Book.objects.update(title=Concat(F('title'), Value('haha'))) 

Q查询

# # 1.查询卖出数大于100或者价格小于600的书籍
    # select * from book where sale_num > 100 or price < 600;
    # res = models.Book.objects.filter(sale_num__gt=100, price__lt=600) # and关系
    # res = models.Book.objects.filter(sale_num__gt=100).filter(price__lt=600) # and关系
    from django.db.models import Q

    # res = models.Book.objects.filter(sale_num__gt=100).filter(price__lt=600) # and关系
    # res = models.Book.objects.filter(Q(sale_num__gt=100), Q(price__lt=600))  # and关系
    # res = models.Book.objects.filter(Q(sale_num__gt=100)|Q(price__lt=600))  # or关系
    # res = models.Book.objects.filter(~Q(sale_num__gt=100)|Q(price__lt=600))  # ~是非的关系
    # print(res)

    # Q补充高级用法
    res = models.Book.objects.filter(Q(sale_num__gt=100) | Q(price__lt=600))
    ''''''
    # 'price'
    # requests.GET.get('sort') # price
    # res = models.Book.objects.filter(price__gt=100)
    # # res = models.Book.objects.filter('price'+'__gt'=100)
    q = Q()
    q.connector = 'or' # 把多个查询条件改为OR关系了
    q.children.append(('maichu__gt', 100))
    q.children.append(('sale_num__lt',100))
    res = models.Book.objects.filter(q)  # and关系 ,,
    print(res)

    # 想学习Q的更高级用法,自行百度

django中如何开启事务

# mysql中的事务
ACID
...

# MySQL的隔离级别:脏读,重复读

开启事务的步骤
1、 开启事务
	start transaction;
2、提交事务
	commit;
3、回滚事务
	rollback;
# django中如何开启事务
  from django.db import transaction
    try:
        with transaction.atomic():
            models.Book.objects.create()
            models.Publish.objects.update()
            # sql1
            # sql2
            ...
    except Exception as e:
        print(e) # 当sql语句出现异常的时候,可以在这里打印错误信息
        transaction.rollback()

模型层中得常见字段和参数

# AutoField
int自增列,必须填入参数 primary_key=True。

# IntegerField
一个整数类型,范围在 -2147483648 to 2147483647。
#  CharField
# DateField
# DateTimeField

auto_now=True
auto_now_add=True

# BooleanField(Field)
- 布尔值类型
# 在代码里面就是要True/False-------------->在数据库中存的是0/1

# TextField(Field)
- 文本类型------------>可以存大段的文本------------->当字符串比较少的时候,一般用varchar(512)
----------》text----->存一篇文章

# FileField(Field)  ------------> 可以上传文件
- 字符串,路径保存在数据库,文件上传到指定目录
- 参数:
upload_to = ""      上传文件的保存路径

# image = models.FileField(upload_to='文件上传的位置')
image = models.ImageField(upload_to='图片')  # 只能上传图片

# FloatField(Field)
- 浮点型

# DecimalField(Field)
- 10进制小数
- 参数:
max_digits,小数总长度
decimal_places,小数位长度

ORM字段参数

#### null

用于表示某个字段可以为空。

# max_length

# verbose_name

# default----->指定默认值
# unique=True

# db_index=True 加索引

自定义字段

class FixedCharField(models.Field):
    """
    自定义的char类型的字段类
    """
    def __init__(self, max_length, *args, **kwargs):
        self.max_length = max_length
        super(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs)

    def db_type(self, connection):
        """
        限定生成数据库表的字段类型为char,长度为max_length指定的值
        """
        return 'char(%s)' % self.max_length


class Class(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=25)
    # 使用自定义的char类型的字段
    cname = FixedCharField(max_length=25)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

骑猪去兜风z1

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

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

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

打赏作者

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

抵扣说明:

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

余额充值