1.不分组情况下聚合查询 aggregate
aggregate(Sum('price'),Max('price'))
属于QuerySet的方法,返回值是字典
2.在分组情况下聚合查询 annotate
分组:values('tag1','tag2').annotate(Sum('price'),max_price=Max('price'))
分组后取字段:在分组后在使用values('分组字段及聚合字段')
分组后筛选:在分组后使用filter('只对聚合结果进行过滤')
3/常用字段与字段的常用属性
choices=((1,'男'),(0,'女'))
4.关系字段
ForeignKey | OneToOneField
models.ForeignKey(to='Book',null=True,on_delete=models.SET_NULL,db_constraint=False)
ManyToManyField
元信息
Model类可以通过元信息类设置索引和排序信息
元信息是在Model类中定义一个Meta子类
class Meta:
自定义表名
db_table='table_name'
联合索引
index_together = ('tag1','tag2')
联合唯一索引
unique_together = ('tag3','tag4')
排序字段
ordering = 'ordering_tag'
#/admin/中显示的表名称
verbose_name = 'table_name'
2.基于对象查询的sql优化
好处:信息存放到对象中,取值方便
坏处:所有字段都进行查询
uq = User.objects.all()
print(uq)
print(uq.query)
only:只取规定的字段形成对象(查主键)
uql = User.objects.all().only('name','age')
print(uql)
print(uql.first().gender))当查询不存在的字段时将重新查询
defer:只取规定的字段外的字段形成对象(查主键)
us = User.objects.all().defer('name','age')
好处:只对所需字段进行查询
坏处:数据放在字典中,相比对象取值不是那么方便
usd = User.objects.values('name','age')
print(usd.query)
在路径中取别名:name = 'show_book' 反解:reverse(name)
前端也可以通过得到的对象进行连表查询
前端进行for循环时,可以使用for_loop确定循环的次数