标签:efi bool price atomic 完整性 了解 1nf objects group by
from django.db.models import Max,Min,Sum,Avg,Count
from django.db.models import Max,Min,Sum,Count,Avg
#筛选出价格最高的书籍
res= models.Book.objects.aggregate(mr=Max('price'))
print(res)
#求书籍总价格
res=models.Book.objects.aggregate(sm=Sum('price'))
print(res)
#书籍平均价格
res=models.Book.objects.aggregate(av=Avg('price'))
print(res)
#合并使用
res=models.Book.objects.aggregate(Max('price'),Min('price'),Sum('price'),Count('price'),Avg('price'))
print(res)
运行结果:
{'price__max': Decimal('444.33'), 'price__min': Decimal('222.22'), 'price__sum': Decimal('999.89'), 'price__count': 3, 'price__avg': 333.296667}
#统计每一本书的作者个数 书名 和对应的作者人数 (正向按字段)
res=models.Book.objects.annotate(author_num=Count('authors__id')).values('title','author_num')
print(res)
#统计出每个出版社卖的最便宜的书的价格 出版社的名字 价格
res=models.Publish.objects.annotate(min_price=Min('book__price')).values('name','min_price')
print(res)
# 按照其他字段分组
res = models.Publish.objects.values('想要分组的字段名').annotate(min_price=Min('book__price')).values('name','min_price')
print(res)
#统计不止一个作者的图书
#先拿书及对应的作者数 再筛选出大于一的图书 书名 作者数
res=models.Book.objects.annotate(author_num=Count('authors')).filter(author_num__gt=1).values('title','author_num')
print(res)
from django.db.models import F,Q
F能够获取表中字段所对应的值
from django.db.models import F,Q
#查询库存数大于卖出数的书籍
res=models.Book.objects.filter(inventory__gt=F('sold')).values('title')
print(res)
#将所有书的价格上涨100块
models.Book.objects.all().update(price=F('price')+100)
# 将所有书的名称后面全部加上 "爆款" 后缀 了解知识点 操作字符串数据需要借助于Concat方法
from django.db.models.functions import Concat
from django.db.models import Value
models.Book.objects.update(title=Concat(F('title'),Value('新款')))
# 查询一下书籍名称是红楼梦 或者 库存数是500的书籍
res=models.Book.objects.filter(Q(title='红楼梦')|Q(inventory=500)) #|是or关系
res1=models.Book.objects.filter(~Q(title='红楼梦')|Q(inventory=500)) #~是not关系
print(res,res1)
#Q对象高级用法
q=Q()
q.connector='or' #默认是and 如果需要or关系就使用这行代码
q.children.append(('title','红楼梦'))
q.children.append(('inventory__gt',500))
res=models.Book.objects.filter(q) #取反
res1=models.Book.objects.filter(~q) #取反
print(res)
print(res1)
CharField varchar
IntegerField int
BigIntegerField bigint
EmailField varchar(254)
DateField
DateTimeField
auto_now:每次修改数据的时候 都会自动将当前修改时间更新上去 实时更新
auto_now_add:在创建数据的时候 会将当前时间自动记录 之后不会自动修改 除非你人为修改
AutoField auto_increment
BooleanField 布尔值
该字段在存储的时候 你只需要传布尔值True或False
它会自动存成1/0
TextField 专门用来存大段文本
FileField 专门用来文件路径 '/etc/data/a.txt'
upload_to = '/etc/data'
给该字段传值的时候 直接传文件对象
会自动将文件对象保存到upload_to后面指定的文件路径中
然后将路径保存到数据库
DecimalField(Field)
- 10进制小数
- 参数:
max_digits,小数总长度
decimal_places,小数位长度
class MyCharField(models.Field):
def __init__(self,max_length,*args,**kwargs):
self.max_length=max_length
#重新调用父类方法
super().__init__(max_length=max_length,*args,**kwargs)
def db_type(self,connection):
return 'char(%s)'%self.max_length #返回结果就是定义字段的类型
事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤销。
事务的四大特性
from django.db import transaction
with transaction.atomic():
#在缩进的代码中书写数据库操作
#该缩进内的所有代码 都是一个事务
pass
标签:efi bool price atomic 完整性 了解 1nf objects group by
原文地址:https://www.cnblogs.com/lidandanaa/p/11954148.html