目录
级联更新 级联删除 外键字段带来的约束
操作外键字段管理数据的时候
书跟出版社是一对多关系 外键字段在书那儿
这个时候如果你把出版社删了 所对应的书也会自动删除
这个时候如果你把出版社主键值改变了 那么书籍表中对应的出版社主键值也会自动修改
聚合函数必须用在分组之后,若没有分组其实默认整体就是一组
from django.db.models import Max,Min,Sun,Count,Avg
max:
1.筛选出价格最高的书籍的
# res = models.Book.objects.aggregate(mr = Max('price'))
Sun:
2.求书籍总价格
# res = models.Book.objects.aggregate(sm = Sum('price'))
Avg:
3.求书籍平均价格
# res = models.Book.objects.aggregate(av = Avg('price'))
4.一起使用
# res = models.Book.objects.aggregate(Max('price'),
# Min('price'),Sum('price'),Count('price'),Avg('price'))
"""
1.统计每一本书的作者个数 书名 和对应的作者人数
res = models.Book.objects.annotate(
author_num=Count('authors__id')).values('title','author_num')
print(res)
2.统计出每个出版社卖的最便宜的书的价格 出版社的名字 价格
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)
3.统计不止一个作者的图书
1.先拿书及对应的作者数
2.再筛选出大于一的图书 书名 作者数目
res = models.Book.objects.annotate(
author_num=Count('authors')).filter(author_num__gt=1).values('title','author_num')
print(res)
4.查询各个作者出的书的总价格 作者名字 总价格
res = models.Author.objects.annotate(
sum_price=Sum('book__price')).values('name','sum_price')
print(res)
"""
'''
from django.db.models import F,Q
F:可以查询自身字段
1. 查询库存数大于卖出数的书籍
res=models.Book.object.filter(ku_cun__gt=F('price'))
2. 将所有书的价格上涨100块
res=models.Book.object.all().update(price=F('price')+100)
3. 将所有书的名称后面全部加上 "爆款" 后缀 了解知识点操作字符串数据需要借助于Concat方法
from django.db.models.functions import Concat
from django.db.models import Value
ret3 = models.Book.objects.update(title=Concat(F('title'), Value('新款')))
'''
'''
from django.db.models import Q
Q:自身字段的筛选与|,~ 一起
1.查询一下书籍名称是三国演义 或者 库存数是500的书籍
res = models.Book.objects.filter(title='三国演义',kun_cun=500) # and关系
res = models.Book.objects.filter(title='三国演义',kun_cun=500) # and关系
# Q包裹之后逗号还是and关系
res = models.Book.objects.filter(Q(title='三国演义'),Q(kun_cun=500))
res = models.Book.objects.filter(Q(title='三国演义') | Q(kun_cun=500)) # |就是or的关系
res = models.Book.objects.filter(~Q(title='三国演义') | Q(kun_cun=500)) # ~就是not关系
Q对象的高级用法:
q=Q()
q.connector='or' 默认是and,可以改成or
q.children.append(('title','三国演义'))
q.children.append(('ku_cun',500))
res=models.Book.object.filter(q)
'''
'''
CharField varchar
IntegerField int
BigIntegerField bigint
EmailField varchar(254)
DateField Date
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) float
'''
# 如何自定义字段类型
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
事务指一组操作,要么都执行成功要么都执行失败
A 原子性:即不能再分的事务,要么全部执行,要么全取消
C 一致性:指事物发生前和发送后,数据的总额依然匹配
I 隔离性: 简单点说,某个事物的操作对其他事务不可见的
D 持久性: 当事务完成后,其影响应该保留下来,不能撤销,只能通过补偿性事务来补偿之前的错误
roolback():回滚到上一个状态
innoDB:支持事务,支持行锁,颗粒型查找
Mylsam:不支持事务,支持表锁
from django.db import transaction
with transaction.atomic():
# 在缩进的代码中书写数据库操作
# 该缩进内的所有代码 都是一个事务
pass
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
原文:https://www.cnblogs.com/hj59988326/p/11952930.html