Django-ORM(查询操作)

一般操作

必知必会13条

<1> all(): 查询所有结果

ret = models.Book.objects.all() # QuerySet类型 --> 书籍对象的列表
print(ret)

<QuerySet [<Book: Book object>]>   
示例

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

ret = models.Book.objects.filter(title='三国演义')  #QuerySet类型
print(ret)
<QuerySet [<Book: 三国演义:18.80>]>

ret = models.Book.objects.filter(id=2)
print(ret)
<QuerySet [<Book: 水浒传:28.80>]>

#ID值大于2的
# ret = models.Book.objects.filter(id__gt=1)
# print(ret)
# < QuerySet[ < Book: 水浒传:28.80 >] >

#ID值小于3的
# ret = models.Book.objects.filter(id__lt=3)
# print(ret)
# < QuerySet[ < Book: 三国演义:18.80 >, < Book: 水浒传:28.80 >] >

#查询出版社日期是2017年的书
# ret = models.Book.objects.filter(publisher_date__year=2017)
# print(ret)

#查询出版社日期大于2018年
# ret = models.Book.objects.filter(publisher_date__year__gt=2017)
# print(ret)

#查询书名中有包含三的书
# ret = models.Book.objects.filter(title__contains='三')
# print(ret)
# < QuerySet[ < Book: 三国演义:18.80 >] >

# 查询书名中有包含三的书,并且书的出版社是2018年的
# ret = models.Book.objects.filter(title__contains='三',publisher_date__year=2018)
# print(ret)
示例

<3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。

    #get方法 如果检索条件找不到对象就报错
    # ret = models.Book.objects.get(id=3)
    # print(ret)
    # 武松打虎: 11.00
示例

<4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象

    #将满足条件的去掉,留下不满足条件的
    # ret = models.Book.objects.exclude(id__in=[1,3,4])
    # print(ret)
    #< QuerySet[ < Book: 水浒传:28.80 >, < Book: 就是你:222.00 >] >
示例

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

  #取字段的值
    # ret = models.Book.objects.filter(title='三国演义').values('title','price')
    # print(ret)
    # < QuerySet[{'title': '三国演义', 'price': Decimal('18.80')}] >
示例


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

#去字段的值,是一个元组
    # ret = models.Book.objects.filter(title='三国演义').values_list('title','price')
    # print(ret)
   
示例

<7> order_by(*field): 对查询结果排序

    #按照字段排序从小到 大
    # ret = models.Book.objects.all().order_by('price')
    # print(ret)

    #按照字段排序从大到小
    # ret = models.Book.objects.all().order_by('-price')
    # print(ret)
示例

<8> reverse(): 对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)。

    # ret = models.Book.objects.all().order_by('price').reverse().values('title')
    # print(ret)
示例


<9> distinct(): 从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果。此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。)

#连表查询
    # ret = models.Book.objects.all().values('publisher__name').distinct()
    # print(ret)
    # < QuerySet[{'publisher__name': '新华社'}, {'publisher__name': '人民广播社'}, {'publisher__name': '黑豹社'}] >
示例

<10> count(): 返回数据库中匹配查询(QuerySet)的对象数量。

    #count计数
    # ret = models.Book.objects.all().count()
    # print(ret)
示例


<11> first(): 返回第一条记录

<12> last(): 返回最后一条记录

    # first()和last()
    # ret = models.Book.objects.all().first()  # 对象  --> 结果集中的第一个数据
    # print(ret)


<13> exists(): 如果QuerySet包含数据,就返回True,否则返回False

 # 判断结果集中是否有数据
    ret = models.Book.objects.all().exists()  # 布尔值  --> 结果集中是否有数据
    print(ret)

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',
        },
    }
}

猜你喜欢

转载自www.cnblogs.com/liuxiangpy/p/9205582.html