ORM单表关键字查询

系列文章目录

初识Django

Django ORM表的创建和增删改查

django请求生命周期流程图和路由层

Django视图层,模版层

all():查询所有结果

    res = models.Book.objects.all()
    print(res)
    # print(res.first())
    # print(res.last())
    # print(res[1])
    
    返回结果是所有queryset对象,queryset支持索引取值
    # <QuerySet [<student: jason>, <student: egon>, <student: ly>, <student: 小张>]>

filter(**kwargs):包含了与所筛选条件相匹配的对象

    res = models.Books.objects.filter(pk=2,title='jpm')
    print(res)
    #<QuerySet [<student: jason>
    返回结果是queryset对象,pk能够自动定位当前主键字段。
    
    'filter括号内可以存放多个条件,默认是and关系
    

values(*field):返回一个ValueQuerySet(特殊的Queryset),运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列

    res = models.Books.object.values('student_is_delete')
    print(res)
    # <QuerySet [{'student_is_delete': False}, {'student_is_delete': True}, {'student_is_delete': False}, {'student_is_delete': False}]>
    values可以指定查询字段,结果是Qureyset 列表套字典
    

values_list(*field):与values()非常相似,它返回的是一个元组序列

    res = models.Book.objects.values_list('title','price')
    print(res)
    # <QuerySet [(False,), (True,), (False,), (False,)]>
    '''values_list也可以指定查询的字段 结果QuerySet  列表套元组'''

first()list():分别获胜queryset第一个和最后一个数据对象

    res = modeks.Book.objects.filter().first()
    print(res)
    
    print(models.student.objects.order_by('price').reverse().first())
    print(models.student.objects.order_by('price').reverse().last())
    
    res = models.Books.objects.all().filter().values('title','price')
     print(res)
    '''只要是queryset对象 就可以无限制的调用queryset对象的方法'''

get()

    res = models.Books.objects.get(pk=100)
    print(res)
    get方法可以直接获取到数据对象
    但该方法当查询条件不存在的时候会直接报错 没有filter好用

exclude():取反 包含的是与所给筛选条件不匹配的对象

    res = models.Books.objects.exclude(pk=1)
    print(res)

order_by 对查询结果进行排序

    res = models.Book.objects.order_by('price')
    print(res) #默认为升序排列
    # <QuerySet [<student: jason>, <student: egon>, <student: ly>

reverse() 对查询结果反向排序,必须提前定义有顺序才可以

    print(models.student.objects.order_by('student_age').reverse())
    # <QuerySet [<student: ly>, <student: 小张>, <student: egon>, <student: jason>]>

distinct 去重

    '''尤其要注意主键字段'''
     res = models.Books.objects.all().values('title','price')
    print(res)
    print(res.distinct())

count() 计数

    print(models.student.objects.all().count())

exists(): 判断结果集是否有数据,如果QuerySet包含数据,就返回True,否则返回False

    res = models.Books.objects.all().exists()
    res1 = models.Books.objects.filter(id=100).exists()
    print(res,res1)  
    # True False

create()、update()、delete()、对象.save()

查看SQL语句

    1.如果当前对象是queryset那么可以直接点query查找该对象内部SQL语句
    2.配置文件(只要执行orm语句都会自动打印SQL语句)
    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',
                },
            }
    }

单表查询之神奇的双下划线查询

    models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值
     
    models.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据
    models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in
     
    models.Tb1.objects.filter(name__contains="ven")  # 获取name字段包含"ven"的
    models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
     
    models.Tb1.objects.filter(id__range=[1, 3])      # id范围是1到3的,等价于SQL的bettwen and
    
    类似的还有:startswith,istartswith, endswith, iendswith 
    
    date字段还可以:
    models.Class.objects.filter(first_day__year=2017)
    date字段可以通过在其后加__year,__month,__day等来获取date的特点部分数据
    # date
    
            models.Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
            models.Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))
    
 # year
models.Entry.objects.filter(pub_date__year=2005)
 models.Entry.objects.filter(pub_date__year__gte=2005)
 # month
  #
 models.Entry.objects.filter(pub_date__month=12)
models.Entry.objects.filter(pub_date__month__gte=6)
    
# day
  #
 models.Entry.objects.filter(pub_date__day=3)
models.Entry.objects.filter(pub_date__day__gte=3)
    
 # week_day
 #
 models.Entry.objects.filter(pub_date__week_day=2)
models.Entry.objects.filter(pub_date__week_day__gte=2)
 需要注意的是在表示一年的时间的时候,我们通常用52周来表示,因为天数是不确定的,老外就是按周来计算薪资的哦~
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值