Django model layer Adv.

Django Advanced Operation

Aggregate query

from django.db.models import Max,Min,Sum,Count,Avg

res = models.Book.objects.aggregate(Sum('price'))
print(res) #{'price__sum': Decimal('263.80')}
'''
aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。
'''

Aggregate function

Max,Min,Sum,Count,Avg 
#其余的百度

Grouping queries

QuerySet to call each object generates a separate statistic

#统计数据库中每一本书的作者个数
res=models.Book.objects.all().annotate(author_num=Count('author'))
    for o in res:
        print(o.author_num)#author_num作为属性存放在对象中
        
#找出每个出版社最便宜的书的价格
res=models.Publisher.objects.all().annotate(min_price=Min('book__price'))
#支持__操作
    for p in res:
        print(p.min_price)

F and Q query

Query F

Django provides F (to) between two field values compared. Examples F. () Can be referenced in the query field, the value to compare different fields of the same model instance two.

#查询卖出数量大于库存数量的书籍
models.Book.objects.filter(kucun__gt=F('maichu'))

Q query

filter () method such as comma-separated relationship with the conditions. If you need to perform more complex queries (such as OR statements), you can use Q objects.

modesls.Book.objects.filter(Q(title='python'),Q(price=666))#与
modesls.Book.objects.filter(Q(title='python')|Q(price=666))#或
modesls.Book.objects.filter(~Q(title='python')|Q(price=666))#非 或

Advanced query Q

q = Q()  #Q实例化出一个对象
# q.connector = 'or' 设置逻辑关系
q.children.append(('title','python')) #以元组方式提供键与值
q.children.append(('title__icontains','python')) #可提供多个,且支持双下划线
q.children.append(('price',666))
models.Book.objects.filter(q)  #可以在fliter中直接放入实例化的对象,默认还是and关系 

Django orm common fields and parameters

Common fields and parameters

AutoField()
    int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列

DateField()
    日期字段,日期格式  YYYY-MM-DD,相当于Python中的datetime.date()实例。

DateTimeField()
    日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。
    auto_now
    auto_now_add

TextField()

EmailField()          varchar(...)

BooleanField()        传布尔值  存0/1

Custom Fields

Baidu

Query Optimization

only与defer

# only(self, *fields)

# 仅取某个表中的数据
models.UserInfo.objects.only('username','id')
或
models.UserInfo.objects.filter(...).only('username','id')
# defer(self, *fields)

models.UserInfo.objects.defer('username','id')
或
models.UserInfo.objects.filter(...).defer('username','id')
# 映射中排除某列数据

Django orm transactional operations

from django.db import transaction
try:
    with transaction.atomic():
        # 事务操作
    except BaseException as e:
        print(e)  
    

Guess you like

Origin www.cnblogs.com/Sheppard/p/11753508.html