Django模型层进阶

[toc]

Django 进阶操作

批量插入数据 bulk_create

1class Books(View): 2 def get(self,request): 3 #方式一:速度极慢,不推荐 4 # for i in range(1000): 5 # models.Book.objects.create(title=f'book{i}') 6 7 #方式二:速度快,推荐 8 book_lis=[] 9 for i in range(10000): 10 book_lis.append(models.Book(title=f'book{i}')) 11 models.Book.objects.bulk_create(book_lis) 12 book_queryset=models.Book.objects.all() 13 14 return render(request,'Books.html',locals())

聚合查询

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

聚合函数

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

分组查询

为调用的QuerySet中每一个对象都生成一个独立的统计值

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

F与Q查询

F查询

Django 提供 F() 来两个字段值之间的比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。

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

Q查询

filter()等方法中逗号隔开的条件是与的关系。 如果你需要执行更复杂的查询(例如OR语句),你可以使用Q对象。

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

进阶Q查询

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

Django orm常见字段及参数

常见字段及参数

1AutoField() 2 int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列 3 4DateField() 5 日期字段,日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例。 6 7DateTimeField() 8 日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。 9 auto_now 10 auto_now_add 11 12TextField() 13 14EmailField() varchar(...) 15 16BooleanField() 传布尔值 存0/1 17

choice参数

1用户性别 2用户学历 3用户工作状态 4客户来源 5... 6 7choices = ( 8 (1,'male'), 9 (2,'female'), 10 (3,'others') 11) 12gender = models.IntegerField(choices=choices) 13""" 14 1.如果我存的是上面元组中数字会怎么样 15 2.如果我存的数字不在元组范围内又会怎样 16 1.数字没有对应关系 是可以存的 17 """ 18 19 20from app01 import models 21user_obj = models.Userinfo.objects.filter(pk=4).first() 22print(user_obj.username) 23print(user_obj.gender) 24# 针对choices字段 如果你想要获取数字所对应的中文 你不能直接点字段 25# 固定句式 数据对象.get_字段名_display() 当没有对应关系的时候 该句式获取到的还是数字 26print(user_obj.get_gender_display()) 27 28 29 30record_choices = (('checked', "已签到"), 31 ('vacate', "请假"), 32 ('late', "迟到"), 33 ('noshow', "缺勤"), 34 ('leave_early', "早退"), 35 ) 36record = models.CharField("上课纪录", choices=record_choices, default="checked", 37 38 39 40 41 score_choices = ((100, 'A+'), 42 (90, 'A'), 43 (85, 'B+'), 44 (80, 'B'), 45 (70, 'B-'), 46 (60, 'C+'), 47 (50, 'C'), 48 (40, 'C-'), 49 (0, ' D'), 50 (-1, 'N/A'), 51 (-100, 'COPY'), 52 (-1000, 'FAIL'), 53 ) 54 score = models.IntegerField("本节成绩", choices=score_choices, default=-1)

自定义字段

百度

查询优化

only与defer

1# only(self, *fields) 2 3# 仅取某个表中的数据 4models.UserInfo.objects.only('username','id') 56models.UserInfo.objects.filter(...).only('username','id') 7 8 9# defer(self, *fields) 10 11models.UserInfo.objects.defer('username','id') 1213models.UserInfo.objects.filter(...).defer('username','id') 14# 映射中排除某列数据

Django orm事务操作

1from django.db import transaction 2try: 3 with transaction.atomic(): 4 # 事务操作 5 except BaseException as e: 6 print(e)
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )