zoukankan      html  css  js  c++  java
  • Django ORM的一般操作


    ORM的一般操作

    #13个必会的orm操作

    #all全查询
    # res=models.Book.objects.all() #QS类型
    # print(res)

    #filter筛选查询
    # res=models.Book.objects.filter(zuozhe=3)#QS类型
    # print(res)

    #gai筛选取对象查询
    # res=models.Book.objects.get(id=3) #对象
    # print(res)

    #exclude去除查询,除了这个参数,其他都显示
    # res=models.Book.objects.exclude(id=4) #QS类型
    # print(res)

    #values获取值,以字典的形式存储
    # res=models.Book.objects.filter(id=3).values() #QS类型字典
    # print(res)

    # res=models.Book.objects.values('title','time')
    # print(res)

    #values_list获取值,以元组的方式存储
    # res=models.Book.objects.filter(id=3).values_list() #QS类型元组
    # print(res)

    #order_by根据某个属性,排序
    # res=models.Book.objects.all().order_by('time')
    # print(res)

    #reverse反向排序,只能反向以排序的值
    # res=models.Book.objects.all().order_by('time').reverse() #QS类型
    # print(res)

    #filter去重
    # res=models.Book.objects.filter()

    #count对象个数
    # res=models.Book.objects.count() #数值
    # print(res)

    #first最上面的一个对象
    # res=models.Book.objects.first() #对象
    # print(res)

    #last最下面的一个对象
    # res=models.Book.objects.last() #对象
    # print(res)

    #exists判断是否有值
    # res=models.Book.objects.exists() #布尔
    # print(res)

    #神奇的下划线

    #gt 大于
    # res=models.Book.objects.filter(id__gt=4)
    # print(res)

    #gte 大于等于
    # res=models.Book.objects.filter(id__gte=4)
    # print(res)

    #lt 小于
    # res=models.Book.objects.filter(id__lt=5)
    # print(res)

    #lte 小于等于
    # res=models.Book.objects.filter(id__lte=5)
    # print(res)

    #gt和lt连用,大于且小于
    # res=models.Book.objects.filter(id__gt=3,id__lt=6)
    # print(res)

    #in 获取列表内选定的
    # res=models.Book.objects.filter(id__in=[3,6])
    # print(res)
    # <QuerySet [<Book: aaa>, <Book: ddd>]>

    #用exclude的话,相当于,not in,获取列表里以外的
    # res=models.Book.objects.exclude(id__in=[5,6])
    # print(res)
    # <QuerySet [<Book: aaa>, <Book: bbb>]>

    #isnull 判断字段是否为空,后面跟True就找出是空的对象,如果跟False,则找出不为空对象
    # res=models.Book.objects.filter(kong2__isnull=True)
    # print(res)
    # <QuerySet [<Book: aaa>, <Book: ccc>]>

    #contains 模糊查询,对应值中包含写入参数的,icontains不区分大小写的查询
    # res=models.Book.objects.filter(title__contains='c')
    # print(res)
    # <QuerySet [<Book: ccc>]>

    #range列表内限定范围查询同bettwen and
    # res=models.Book.objects.filter(id__range=[3,5])
    # print(res)
    # <QuerySet [<Book: aaa>, <Book: bbb>, <Book: ccc>]>

    # startswith 以书面开头,istartswith 忽略大小写以书面开头, endswith 以什么结尾, iendswith忽略大小写以书面结尾

    # regex正则匹配,iregex 不区分大小写
    # res=models.Book.objects.filter(title__regex=r'aaa|bbb')
    # print(res)
    # res=models.Book.objects.filter(title__iregex=r'AAA|BBB')
    # print(res)
    # <QuerySet [<Book: aaa>, <Book: bbb>]>
    # <QuerySet [<Book: aaa>, <Book: bbb>]>

    #date,具体时间,year,年,month,月,day,日,week_day,星期几,hour,小时,minute,分,second,秒
    #______________________________________________________________________
    # res=models.Book.objects.filter(time__date=datetime.date(2018,6,21))
    # print(res)
    #______________________________________________________________________
    # res=models.Book.objects.filter(time__day=21)
    # print(res)
    # <QuerySet [<Book: aaa>]>

    #外键的正向查询
    # 对象直接点外键字段名,获取对象
    # obj=models.Book.objects.first()
    # res=obj.cbs
    # print(res,type(type))

    #用外键表名__来跨表查询
    # res=models.Book.objects.filter(id=3).values('cbs__name')
    # print(res)
    # <QuerySet [{'cbs__name': '第一出版社'}]>

    #外键的反向查询
    #对象点反向外键类名_set,来获取对象列表
    # obj=models.Cbs.objects.first()
    # res=obj.book_set.first()
    # print(res)
    #related_name,赋值可以代替类名_set,入代替book_set,related_query_name赋值可以代替表名,用于关联动态表时或QS类型时

    #用外键表名__来跨表查询
    # res=models.Cbs.objects.filter(id=3).values('book__title')
    # print(res)
    # <QuerySet [{'book__title': 'ccc'}]>

    #多对多
    # create 创建关联的
    # obj=models.Zuozhe.objects.first()
    # obj.book_set.create(title='eeee',time=datetime.datetime.now,money=300,cbs_id=1,kong='a',kong2='aaa')

    #add 加入可用添加关联的对象,也可用id添加 ,添加多个要用*把列表打散添加
    # z_obj=models.Zuozhe.objects.get(id=2)
    # s_obj=models.Book.objects.get(id=7)
    # z_obj.book_set.add(s_obj)
    # d_obj=models.Book.objects.exclude(id__regex=r'4|5|7')
    # print(d_obj)
    # z_obj.book_set.add(*d_obj)

    #remove 删除关联的,可用对象,可用id
    # b_obj=models.Book.objects.get(id=7)
    # z_obj=models.Zuozhe.objects.get(id=2)
    # z_obj.book_set.remove(b_obj)

    #clear 清除所有关联的
    # z_obj=models.Zuozhe.objects.get(id=2)
    # z_obj.book_set.clear()

    #注意外键反向操作时,只有null=True时,才有clear和remove功能

    # 聚合查询

    #需要导入
    from django.db.models import Avg, Sum, Max, Min, Count,Value

    #调用方法聚合处理
    # ret=models.Book.objects.aggregate(sum_money=Sum('money'))
    # print(ret)
    # {'sum_money': Decimal('1900.00')}

    #调用多个方法以逗号分隔
    # ret=models.Book.objects.aggregate(sum_money=Sum('money'),max=Max('money'),min=Min('money'))
    # print(ret)
    # {'sum_money': Decimal('1900.00'), 'max': Decimal('800.00'), 'min': Decimal('100.00')}

    # 分组查询

    #annotate分组 前values筛选分组,不写默认全分组,后面values得值
    # ret=models.Book.objects.annotate(shu=Count('zuozhe')).values('title','shu')
    # print(ret)

    # res=models.Book.objects.values('cbs_id').annotate(he=Sum('money')).values('cbs_id','he')
    # print(res)

    # 练习题:
    # 1.统计每一本书的作者个数
    # ret=models.Book.objects.annotate(shu=Count('zuozhe')).values('title','shu')
    # print(ret)

    # 2.统计出每个出版社买的最便宜的书的价格
    # ret=models.Cbs.objects.annotate(pianyi=Min('book__money')).values('name','pianyi')
    # print(ret)
    # 3.统计不止一个作者的图书
    # ret=models.Book.objects.annotate(shu=Count('zuozhe')).filter(shu__gt=1).values('title','shu')
    # print(ret)
    # 4.根据一本图书作者数量的多少对查询集 QuerySet进行排序
    # ret=models.Book.objects.annotate(shu=Count('zuozhe')).order_by('shu').reverse()
    # print(ret)
    # 5.查询各个作者出的书的总价格
    # ret=models.Zuozhe.objects.annotate(shu=Sum('book__money')).values('name','shu')
    # print(ret)

    #F查询 #字段与字段之间
    # 需要导入
    from django.db.models import F

    #F 用于字段与字段之间的查找,支持运算符号
    # ret=models.Book.objects.filter(maichu__gt=F('kuchun')).values('maichu','kuchun')
    # print(ret)

    #update F中用于更新,只用于数字
    # models.Book.objects.update(maichu=F('maichu')+10)

    #字符串添加需要导入Concat
    from django.db.models.functions import Concat

    #字符串添加 Concat拼接 Value值 F取原值,Value填你想拼接的值,最后用Concat拼接
    # models.Book.objects.update(title=Concat(F('title'),Value('g')))

    # Q查询 #逻辑符号
    #需要导入
    from django.db.models import Q

    #Q 用于多个字段之间运用与& 或| 非~ 操作
    # ret=models.Book.objects.filter(Q(maichu__gt=50) & Q(money__gt=500)).values('money','maichu')
    # print(ret)
    # < QuerySet[{'money': Decimal('800.00'), 'maichu': 60}] >

    #带关键字参数的话,关键字参数必须放在Q参数后面
    # ret=models.Book.objects.filter(Q(money__lt=500) & ~Q(kuchun=50),cbs_id=2)
    # print(ret)
    # < QuerySet[ < Book: dddg >] >

    # 事务 #事务内的代码块必须全部执行成功才会执行,出现一个错误,整个都会变回原样

    #必须导入
    from django.db import transaction

    # try:
    # with transaction.atomic():
    # models.Cbs.objects.create(name='逗比出版社',chenghsi='逗比星')
    # models.Zuozhe.objects.create(name='gg',age=18,dianhua=18888888,xiangqing_id=8)
    #
    # except Exception as e:
    # print(e)



    # Django终端打印SQL语句
    # 在Django项目的settings.py文件中,在最后复制粘贴如下代码:

    # LOGGING = {
    # 'version': 1,
    # 'disable_existing_loggers': False,
    # 'handlers': {
    # 'console':{
    # 'level':'DEBUG',
    # 'class':'logging.StreamHandler',
    # },
    # },
    # 'loggers': {
    # 'django.db.backends': {
    # 'handlers': ['console'],
    # 'propagate': True,
    # 'level':'DEBUG',
    # },
    # }
    # }


    # 在Python脚本中调用Django环境

    #新建py文件,复制代码,注意导入models,是你要用的app名字,下面app01只是例子

    # import os
    #
    # if __name__ == '__main__':
    # os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings")
    # import django
    # django.setup()
    #
    # from app01 import models
    #



  • 相关阅读:
    安装CentOS7重启后提示License information
    使用VMware 安装Linux CentOS7
    VS 2015相当不错的功能:C#交互窗口
    未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage”包
    RabbitMQ service is already present
    RabbitMQ安装后不能运行 Error: unable to connect to node nodedown
    〖Demo〗-- 计算器
    〖Demo〗-- HAproxy配置文件操作
    〖Python〗-- 模块系列(二)
    〖Python〗-- 模块系列(一)
  • 原文地址:https://www.cnblogs.com/yangli0504/p/9215347.html
Copyright © 2011-2022 走看看