ORM了解知识

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确定循环的次数  

原文地址:https://www.cnblogs.com/suncunxu/p/10496168.html