Django模型层进阶

Stella981
• 阅读 683

[toc]

Django 进阶操作

批量插入数据 bulk_create

class Books(View):
    def get(self,request):
        #方式一:速度极慢,不推荐
        # for i in range(1000):
        #     models.Book.objects.create(title=f'book{i}')
    
        #方式二:速度快,推荐
        book_lis=[]
        for i in range(10000):
            book_lis.append(models.Book(title=f'book{i}'))
        models.Book.objects.bulk_create(book_lis)
        book_queryset=models.Book.objects.all()

        return render(request,'Books.html',locals())

聚合查询

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 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。
'''

聚合函数

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

分组查询

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

#统计数据库中每一本书的作者个数
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与Q查询

F查询

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

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

Q查询

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

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))#非 或

进阶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常见字段及参数

常见字段及参数

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

choice参数

用户性别
用户学历
用户工作状态
客户来源
...

choices = (
    (1,'male'),
    (2,'female'),
    (3,'others')
)
gender = models.IntegerField(choices=choices)
"""
        1.如果我存的是上面元组中数字会怎么样
        2.如果我存的数字不在元组范围内又会怎样
            1.数字没有对应关系 是可以存的
        """


from app01 import models
user_obj = models.Userinfo.objects.filter(pk=4).first()
print(user_obj.username)
print(user_obj.gender)
# 针对choices字段 如果你想要获取数字所对应的中文 你不能直接点字段
# 固定句式   数据对象.get_字段名_display()  当没有对应关系的时候 该句式获取到的还是数字
print(user_obj.get_gender_display())



record_choices = (('checked', "已签到"),
                  ('vacate', "请假"),
                  ('late', "迟到"),
                  ('noshow', "缺勤"),
                  ('leave_early', "早退"),
                 )
record = models.CharField("上课纪录", choices=record_choices, default="checked", 




                          score_choices = ((100, 'A+'),
                                           (90, 'A'),
                                           (85, 'B+'),
                                           (80, 'B'),
                                           (70, 'B-'),
                                           (60, 'C+'),
                                           (50, 'C'),
                                           (40, 'C-'),
                                           (0, ' D'),
                                           (-1, 'N/A'),
                                           (-100, 'COPY'),
                                           (-1000, 'FAIL'),
                                          )
                          score = models.IntegerField("本节成绩", choices=score_choices, default=-1)

自定义字段

百度

查询优化

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事务操作

from django.db import transaction
try:
    with transaction.atomic():
        # 事务操作
    except BaseException as e:
        print(e)
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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
Wesley13 Wesley13
2年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
待兔 待兔
2个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
2年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
8个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这